[整理] 单调队列题目整理

连着刷了 4 天 12 道单调队列整理一下这些题的解法,找一找关于单调队列共性的东西。

 dp 方程想起来比较简单,但是显然暴力转移会 T,考虑单调队列。

因为题目是要用 dp[i-k] 来更新 dp[i] ,所以单调队列在转移的时候 push 的应该是 dp[i-l],而不是 dp[i]

也就是说,对于这种从前面来更新当前的转移, push 的时候应该 push i-k (k 为一个常数) 的值,push 完之后再用队头更新当前的答案。

[整理] 单调队列题目整理

[整理] 单调队列题目整理

#include<cstdio> #include<cstring> #include<iostream> #define N 200005 int dp[N]; int n,l,r; int val[N]; int q[N],hd,tail; signed main(){ scanf("%d%d%d",&n,&l,&r); if(l>r) l^=r^=l^=r; for(int i=0;i<=n;i++) scanf("%d",&val[i]); hd=tail=1; q[1]=0; for(int i=l;i<=n;i++){ while(hd<=tail&&i-q[hd]>r) hd++; // printf("i=%d,q[hd]=%d\n",i,q[hd]); while(hd<=tail&&dp[q[tail]]<=dp[i-l]) tail--; q[++tail]=i-l; dp[i]=dp[q[hd]]+val[i]; // printf("dp[i]=%d\n",dp[i]); } int maxn=0; for(int i=n-r+1;i<=n;i++) maxn=std::max(maxn,dp[i]); printf("%d\n",maxn); return 0; }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpfwxz.html