陈老师搬书

Ø陈老师桌上的书有三堆,每一堆都有厚厚的一叠,你想逗一下陈老师,于是你设计一个最累的方式给他,让他把书拿下来给同学们。若告诉你这三堆分别有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;
}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值