题目描述
话说发源于小朋友精心设计的游戏被电脑组的童鞋们藐杀之后非常不爽,为了表示安慰和鼓励,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;
}
标签:洛谷,钓鱼,int,题解,钓到,个数,p1717,101,数量
From: https://blog.csdn.net/2201_75683257/article/details/141227911