P1717 钓鱼
贪心+堆的方法其他题解已经讲的很清楚了,这里放出萌新简洁的dp做法,如果有正确性问题希望大佬能够指出qwq
#include 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); }