题解 P1717 【钓鱼】

P1717 钓鱼

贪心+堆的方法其他题解已经讲的很清楚了,这里放出萌新简洁的dp做法,如果有正确性问题希望大佬能够指出qwq

#include<cstdio>
using namespace std;
#define max(a,b) (a>b ? a:b)
int n,m,ans,f[101][1001],a[101],b[101],t[101];
int main() {
	scanf("%d%d",&n,&m);
	m*=12;		//有(m*60/5)个五分钟
    
	for (int i=1; i<=n; i++) scanf("%d",&a[i]);
	for (int i=1; i<=n; i++) scanf("%d",&b[i]);
	for (int i=2; i<=n; i++) scanf("%d",&t[i]);		//t[i]:从i-1到i的路程时间

	//f[i][j]是走到第i个湖,时间为j的最多钓鱼数
    
	for (int i=1,tmp=t[1]; i<=n; tmp+=t[i+1],i++)	//tmp是从1到i的路程总用时
		for (int j=tmp; j<=m; j++){		//枚举到湖i的用时(至少是走到i的时间tmp)
			for (int k=0; k<=j-tmp; k++) 		//在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]));
                //钓鱼数为a[i]*k-(1+2+3+...+(k-1))*b[i]
				ans=max(ans,f[i][j]);//更新答案
			}
	printf("%d",ans);
}
原文地址:https://www.cnblogs.com/Randolph68706/p/11282775.html