Ø陈老师桌上的书有三堆,每一堆都有厚厚的一叠,你想逗一下陈老师,于是你设计一个最累的方式给他,让他把书拿下来给同学们。若告诉你这三堆分别有i,j,k本书,以及每堆从下到上书的质量,每次取书只能从任一堆的最上面取,显然,每次取书陈老师的体力消耗都会加大,这里用体力系数代表,取下第一本书时,体力系数为1,第二本书时体力系数为2,依次类推,而每次体力消耗值则为体力系数与书的重量之积。
Ø输入:第一行3个整数,分别为三堆书的数量i,j,k;第二行至第四行分别为每堆由下至上的书本重量。
Ø输出:一行,输出最累方式的体力消耗总值。
输入样例: 输出样例:257
3 2 4
2 3 2
1 5
9 8 7 4
我发现照着幻灯片写题可以水出很多篇博客
这道题f[i][j][k]表示a中取了i本书,b中取了j本书,c中取了k本书的消耗体力数
然后就照着题意写就行了
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
int ia,ja,ka;
int ans = 0;
int a[103],b[103],c[103];
int f[103][103][103];
int main()
{
scanf("%d%d%d",&ia,&ja,&ka);
for(int x = ia;x >= 1;x--)scanf("%d",&a[x]);
for(int x = ja;x >= 1;x--)scanf("%d",&b[x]);
for(int x = ka;x >= 1;x--)scanf("%d",&c[x]);
for(int i = 0;i <= ia;i++)
{
for(int j = 0;j <= ja;j++)
{
for(int k = 0;k <= ka;k++)
{
if(i >= 1)f[i][j][k] = max(f[i][j][k],f[i - 1][j][k] + a[i] * (i + k + j));
if(j >= 1)f[i][j][k] = max(f[i][j][k],f[i][j - 1][k] + b[j] * (i + k + j));
if(k >= 1)f[i][j][k] = max(f[i][j][k],f[i][j][k - 1] + c[k] * (i + k + j));
}
}
}
printf("%d",f[ia][ja][ka]);
return 0;
}