bzoj3831 [Poi2014]Little Bird(单调队列优化dp)
2018-01-30 22:40
423 查看
f[i]表示跳到i的最小体力。则容易得到转移方程:
f[i]=min{f[j]+(a[j]<=a[i])|i−k<=j<i}
由于有(a[j]<=a[i])的存在,看似不能单调队列优化了,其实无妨。。。因为最多只加一。所以在维护单调队列的时候注意如果dp值相等就以a值较大为优即可。
f[i]=min{f[j]+(a[j]<=a[i])|i−k<=j<i}
由于有(a[j]<=a[i])的存在,看似不能单调队列优化了,其实无妨。。。因为最多只加一。所以在维护单调队列的时候注意如果dp值相等就以a值较大为优即可。
#include <cstdio> #include <cstring> #include <algorithm> #include <queue> using namespace std; #define ll long long #define inf 0x3f3f3f3f #define N 1000100 inline int read(){ int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar(); return x*f; } int n,K,dp ,q ,h=1,t=0,a ; int main(){ // freopen("a.in","r",stdin); n=read(); for(int i=1;i<=n;++i) a[i]=read(); int owo=read(); while(owo--){ K=read();memset(dp,inf,sizeof(dp));h=1;t=0; dp[1]=0;q[++t]=1; for(int i=2;i<=n;++i){ while(h<=t&&q[h]+K<i) ++h; dp[i]=dp[q[h]]+(a[q[h]]<=a[i]); while(h<=t&&(dp[q[t]]>dp[i]||(dp[q[t]]==dp[i]&&a[q[t]]<a[i]))) --t; q[++t]=i; }printf("%d\n",dp ); }return 0; }
相关文章推荐
- 【bzoj3831】[Poi2014]Little Bird 单调队列优化dp
- bzoj3831 [Poi2014]Little Bird 单调队列优化dp
- 【bzoj3831】[Poi2014]Little Bird(单调队列优化dp)
- BZOJ 3831 [Poi2014]Little Bird【单调队列优化dp
- BZOJ_3831_[Poi2014]Little Bird_单调队列优化DP
- BZOJ 3831 POI 2014 Little Bird 单调队列DP
- [POI 2014]Little Bird(单调队列优化DP)
- 【单调队列】【动态规划】bzoj3831 [Poi2014]Little Bird
- 【BZOJ3831】Little Bird,单调队列优化DP
- 【BZOJ】【P3831】【Poi2014】【Little Bird】【题解】【单调队列+DP】
- 3831: [Poi2014]Little Bird|DP|单调队列
- bzoj3831 洛谷3572 little bird 单调队列优化dp
- 【BZOJ3831】【POI2014】Little Bird 单调队列,''再不刷它就土了''系列。
- bzoj 3831 Little Bird (单调队列优化dp)
- 【BZOJ3831】[Poi2014]Little Bird 单调队列
- BZOJ 2806: [Ctsc2012]Cheat 后缀自动机+单调队列优化DP
- bzoj3831[Poi2014] Little Bird(单队)
- 【bzoj1499】[NOI2005]瑰丽华尔兹 【单调队列优化dp】
- [后缀自动机][单调队列优化DP] BZOJ 2806: [Ctsc2012]Cheat
- BZOJ 2442 [Usaco2011 Open]修剪草坪 DP+单调队列优化