单调队列优化的DP
单调队列优化的DP
k递增,calc递减的单调队列
# include <bits/stdc++.h>
using namespace std;
struct rec{ int L,P,S; } a[110];
int N,M,f[110][16010],q[16010];
bool operator < (rec a,rec b){
return a.S<b.S;
}
int calc(int i,int k){
return f[i-1][k]-a[i].P*k;
}
int main()
{
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+1+M);
for(int i=1;i<=M;++i){
int L=1,R=0; //L为对头,R为队尾
for(int k=max(0,a[i].S-a[i].L);k<=a[i].S-1;++k){//入队操作
while(L<=R&&calc(i,q[R])<=calc(i,k)) 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&&q[L]<j-a[i].L) L++; //剔除已死亡的决策
if(L<=R) f[i][j]=max(f[i][j],calc(i,q[