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);
}