洛谷p1717题解

题目描述

话说发源于小朋友精心设计的游戏被电脑组的童鞋们藐杀之后非常不爽,为了表示安慰和鼓励,VIP999 决定请他吃一次“年年大丰收”,为了表示诚意,他还决定亲自去钓鱼。

但是,因为还要准备 NOIP2013, z 老师只给了他 H 个小时的空余时间,假设有 n 个鱼塘都在一条水平路边,从左边到右编号为 1,2,3…n 。

VIP 是个很讲究效率的孩子,他希望用这些时间钓到尽量多的鱼。他从湖1出发,向右走,有选择的在一些湖边停留一定的时间钓鱼,最后在某一个湖边结束钓鱼。他测出从第 i 个湖到 i+1 个湖需要走 5×ti​ 分钟的路,还测出在第 i 个湖边停留,第一个 5 分钟可以钓到鱼 fi,以后再每钓 5 分钟鱼,鱼量减少 di​。为了简化问题,他假定没有其他人钓鱼,也不会有其他因素影响他钓到期望数量的鱼。请编程求出能钓最多鱼的数量。

输入格式

第一行:湖的数量 n。

第二行:时间 h(小时)。

第三行:n 个数,f1,f2,…,fn​。

第四行:n 个数,d1,d2,…,dn​。

第五行:n−1 个数,t1,t2,…,tn−1​

输出格式

一个数,所能钓鱼的最大数量。

输入输出样例

输入 #1复制

2
1
10 1
2 5
2

输出 #1复制

31

说明/提示

数据范围:1≤H≤16,2≤n≤25,1≤fi≤200,0≤di≤20,1≤ti≤20。

思路:

由于贪心不会,我们考虑dp。

先输入:

cin>>n>>m;
m*=12;
for(int i=1;i<=n;i++)cin>>a[i];
for(int i=1;i<=n;i++)cin>>b[i];
for(int i=2;i<=n;i++)cin>>t[i];

设f[i][j]表示j小时内在前i的鱼塘内进行钓鱼的最大数量,则有

f[i][j]=max(f[i][j],f[i-1][j-t[i]-k]+max(0,k*a[i]-k*(k-1)/2*b[i]));

所以,

Code:

这你也要抄?

#include<bits/stdc++.h>
using namespace std;
int n,m,ans,f[101][1001],a[101],b[101],t[101];
int main() {
	cin>>n>>m;
	m*=12;
	for(int i=1;i<=n;i++)cin>>a[i];
	for(int i=1;i<=n;i++)cin>>b[i];
	for(int i=2;i<=n;i++)cin>>t[i];
	for(int i=1,tmp=t[1];i<=n;tmp+=t[i+1],i++)
		for(int j=tmp;j<=m;j++){
			for(int k=0;k<=j-tmp;k++)
				f[i][j]=max(f[i][j],f[i-1][j-t[i]-k]+max(0,k*a[i]-k*(k-1)/2*b[i]));
                ans=max(ans,f[i][j]);
			}
	cout<<ans;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值