Problem U: 搬书

知识共享许可协议 版权声明:署名,允许他人基于本文进行创作,且必须基于与原先许可协议相同的许可协议分发本文 (Creative Commons

Problem U: 搬书

Description
陈老师桌上的书有三堆,每一堆都有厚厚的一叠,你想逗一下陈老师,于是你设计一个最累的方式给他,让他把书
拿下来给同学们。若告诉你这三堆分别有i,j,k本书,以及每堆从下到上书的质量,每次取书只能从任一堆的最上
面取,显然,每次取书陈老师的体力消耗都会加大,这里用体力系数代表,取下第一本书时,体力系数为1,第二
本书时体力系数为2,依次类推,而每次体力消耗值则为体力系数与书的重量之积。书最多有100本。
Input
第一行3个整数,分别为三堆书的数量i,j,k;第二行至第四行分别为每堆由下至上的书本重量。
Output
一行,输出最累方式的体力消耗总值
Sample Input
3 2 4
2 3 2
1 5
9 8 7 4
Sample Output
257
HINT

DP和DFS都可以做。

#include<bits/stdc++.h>
using namespace std;
int dp[100][100][100],a[1000],b[1000],c[1000];
int x,y,z;
int main(){
    cin>>x>>y>>z;
   for(int i=x;i>=1;i--)cin>>a[i];
   for(int i=y;i>=1;i--)cin>>b[i];
   for(int i=z;i>=1;i--)cin>>c[i];
   for(int i=0;i<=x;i++){
     for(int j=0;j<=y;j++){
        for(int k=0;k<=z;k++){
//dp[i][j][k]表示a中取了i本书,b中取了j本书,c中取了k本书的消耗体力
                if(i-1>=0)dp[i][j][k]=dp[i-1][j][k]+a[i]*(i+j+k);
                //只有i+j+k的和才可以为100,所以用重量*(i+j+k就行了 
                if(j-1>=0)dp[i][j][k]=max(dp[i][j][k],dp[i][j-1][k]+b[j]*(i+j+k));
                if(k-1>=0)dp[i][j][k]=max(dp[i][j][k],dp[i][j][k-1]+c[k]*(i+j+k));
           //以此类推 
		   }
       }
   }
   cout<<dp[x][y][z];
    return 0;
}

猜你喜欢

转载自blog.csdn.net/ebirth/article/details/95326019
u