单调队列优化DP的模板题
不难列出DP方程:
对于买入的情况
由于dp[i][j]=max{dp[i-w-1][k]+k*Ap[i]-j*Ap[i]}
AP[i]*j是固定的,在队列中维护dp[i-w-1][k]+k*Ap[i]的单调性即可
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; ; ]; int main(){ scanf("%d%d%d", &T, &maxP, &w); ; i<=T; i++) scanf("%d%d%d%d", &Ap[i], &Bp[i], &As[i], &Bs[i]); memset(dp,-,sizeof(dp)); ; i<=T; i++){ ; j<=As[i]; j++) dp[i][j]=-Ap[i]*j; ; j<=maxP; j++) dp[i][j]=max(dp[i][j], dp[i-][j]); >=){ , tail=; ; j<=maxP; j++){ while (head<tail && q[head]+As[i]<j) head++; ][j]+j*Ap[i] >= dp[i-w-][q[tail-]]+q[tail-]*Ap[i]) tail--; q[tail++]=j; ][q[head]]-(j-q[head])*Ap[i]); } head=, tail=; ; j--){ while (head<tail && q[head]-Bs[i]>j) head++; ][j]+j*Bp[i] >= dp[i-w-][q[tail-]]+q[tail-]*Bp[i]) tail--; q[tail++]=j; ][q[head]]+(q[head]-j)*Bp[i]); } } } ; ; i<=maxP; i++) ans=max(ans, dp[T][i]); printf("%d\n", ans); ; }