易错点:
- 需要掌握单调队列优化DP的基本方法.
- 题目直接给出的数据在初始化时经常需要进行排序处理.
#include<cstdio> #include<iostream> #include<algorithm> using namespace std; const int MAXN=32000,MAXM=200; int f[MAXM][MAXN],q[MAXN]; struct rec{ int l,p,s; bool operator <(rec another)const{ return s<another.s; } }a[MAXM]; int main(){ int n,m; scanf("%d%d",&n,&m); for(int i=1;i<=m;i++){ scanf("%d%d%d",&a[i].l,&a[i].p,&a[i].s); } sort(a+1,a+m+1); for(int i=1;i<=m;i++){ int l=1,r=0; for(int k=max(0,a[i].s-a[i].l);k<=a[i].s-1;k++){ while(l<=r&&f[i-1][k]-k*a[i].p>=f[i-1][q[r]]-q[r]*a[i].p)r--; q[++r]=k; } for(int j=1;j<=n;j++){ f[i][j]=max(f[i-1][j],f[i][j-1]); if(j>=a[i].s){ while(l<=r&&j-q[l]>a[i].l)l++; if(l>r)continue; f[i][j]=max(f[i][j],f[i-1][q[l]]+(j-q[l])*a[i].p); } } } printf("%d\n",f[m][n]); return 0; }