bzoj 2442: [Usaco2011 Open]修剪草坪 单调队列优化dp
2016-11-23 21:32
417 查看
题意
给出n个数,要求选出若干个数,满足没有连续超过k个数被选中且和最大。k<=n<=100000
分析
设f[i]表示前i个数中选出若干个的最大和,sum[i]表示前i个数的和显然f[i]=min(f[j−2]+sum[i]−sum[j−1])
那么这个东西只要拿单调队列来优化一下就好了。
代码
#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<algorithm> #define N 100005 #define ll long long using namespace std; int n,m,q ; ll sum ,f ; int main() { scanf("%d%d",&n,&m); for (int i=1;i<=n;i++) { scanf("%lld",&sum[i]); sum[i]+=sum[i-1]; } f[1]=sum[1]; int head=1,tail=0; ll ans=f[1]; for (int i=2;i<=n;i++) { f[i]=max(f[i-1],f[max(0,i-m-1)]+sum[i]-sum[max(0,i-m)]); while (head<=tail&&q[head]<i-m+1) head++; while (head<=tail&&f[i-2]+sum[i]-sum[i-1]>f[q[tail]-2]+sum[i]-sum[q[tail]-1]) tail--; q[++tail]=i; f[i]=max(f[i],f[q[head]-2]+sum[i]-sum[q[head]-1]); ans=max(ans,f[i]); } printf("%lld",ans); return 0; }
相关文章推荐
- bzoj2442[Usaco2011 Open]修剪草坪 单调队列优化dp
- bzoj2442[Usaco2011 Open]修剪草坪 单调队列优化dp
- 【bzoj2442/Usaco2011 Open】修剪草坪——单调队列优化dp
- BZOJ 2442 [Usaco2011 Open]修剪草坪 DP+单调队列优化
- [BZOJ2442][Usaco2011 Open]修剪草坪 dp+单调队列优化
- bzoj[2442][Usaco2011 Open]修剪草坪(单调队列+dp)
- 2442: [Usaco2011 Open]修剪草坪 单调队列优化DP
- 【bzoj2442】【Usaco2011 Open】修剪草坪【dp+单调队列】
- 【bzoj 2442】【codevs 4654】[Usaco2011 Open]修剪草坪(dp+单调队列)
- BZOJ 2442[Usaco2011 Open] 修剪草坪 (dp+单调队列)
- [Usaco2011][bzoj2442][洛谷2527]修剪草坪解题报告(dp,贪心,单调队列)
- BZOJ_2343_[Usaco2011 Open]修剪草坪 _单调队列_DP
- bzoj2442: [Usaco2011 Open]修剪草坪(单调队列优化dp)
- bzoj 2442: [Usaco2011 Open]修剪草坪(单调队列)
- BZOJ2442 Usaco2011 Open修剪草坪(动态规划+单调队列)
- [BZOJ 2442][Usaco2011 Open]修剪草坪:单调队列
- BZOJ_P2442 [Usaco2011 Open]修剪草坪(单调队列)
- BZOJ 2442: [Usaco2011 Open]修剪草坪( dp )
- 【codevs4654】【BZOJ2442】修剪草坪,第一次的单调队列,优化DP
- BZOJ2442: [Usaco2011 Open]修剪草坪