HDU 3415 Max Sum of Max-K-sub-sequence
2014-05-20 17:19
281 查看
比较经典的单调队列题目。
我们考虑每一个区间的末尾端点。
对于这个端点,只可能做以下决策:取前面的点作为区间开始,或者以自身作为区间开始。
那么,我们维护的队列就有以下的特性:队头元素对于将要考虑的区间端点是最优的(这也说明了,我们需要在添加元素之前更新队列结构)。
此外,我们也需要维护序列长度不超过k的特性,这个从头开始删除就好了。
第二个while()也可以写在后面一点的位置,判定条件不一样而已。
我们考虑每一个区间的末尾端点。
对于这个端点,只可能做以下决策:取前面的点作为区间开始,或者以自身作为区间开始。
那么,我们维护的队列就有以下的特性:队头元素对于将要考虑的区间端点是最优的(这也说明了,我们需要在添加元素之前更新队列结构)。
此外,我们也需要维护序列长度不超过k的特性,这个从头开始删除就好了。
第二个while()也可以写在后面一点的位置,判定条件不一样而已。
#include <cstdio> #define maxn 100005 int a[maxn<<1]; int sum[maxn<<1]; int Q[maxn<<1]; int main() { int T; scanf("%d",&T); while(T--) { int n,k; scanf("%d%d",&n,&k); for(int i=1;i<=n;i++) { scanf("%d",&a[i]); a[i+n]=a[i]; } sum[0]=0; for(int i=1;i<=2*n;i++) { sum[i]=sum[i-1]+a[i]; } int head,tail; head=tail=0; int s,e,ans; s=e=1,ans=a[1]; for(int i=1;i<=2*n;i++) { while(head<tail&&sum[i-1]-sum[Q[tail-1]-1]<0) tail--; Q[tail++]=i; while(head<tail&&i-Q[head]+1>k) head++; int tmp=sum[i]-sum[Q[head]-1]; if(tmp>ans) { s=Q[head]; e=i; ans=tmp; } } s = s>n ? s-n:s; e = e>n ? e-n:e; printf("%d %d %d\n",ans,s,e); } return 0; }
相关文章推荐
- HDU 3415——Max Sum of Max-K-sub-sequence
- hdu 3415 Max Sum of Max-K-sub-sequence 单调队列 求连续l(1<=l<=k)个数的和的最大值 数列可循环
- hdu 3415 Max Sum of Max-K-sub-sequence
- hdu 3415 Max Sum of Max-K-sub-sequence 单调队列dp
- HDU 3415 Max Sum of Max-K-sub-sequence
- hdu 3415 Max Sum of Max-K-sub-sequence
- hdu 3415 Max Sum of Max-K-sub-sequence题解
- HDU 3415 Max Sum of Max-K-sub-sequence[单调队列优化dp]
- HDU 3415 Max Sum of Max-K-sub-sequence(单调队列)
- HDU 3415 Max Sum of Max-K-sub-sequence
- 【HDU】3415 Max Sum of Max-K-sub-sequence
- 【单调队列】hdu 3415 Max Sum of Max-K-sub-sequence
- HDU--杭电--3415--Max Sum of Max-K-sub-sequence--队列--双向队列
- HDU 3415 Max Sum of Max-K-sub-sequence[单调队列优化dp]
- HDU 3415 Max Sum of Max-K-sub-sequence(单调队列)
- hdu 3415 Max Sum of Max-K-sub-sequence
- HDU 3415(Max Sum of Max-K-sub-sequence-单调队列优化DP)
- HDU 3415 Max Sum of Max-K-sub-sequence(单调队列)
- hdu - 3415 Max Sum of Max-K-sub-sequence
- hdu 3415 Max Sum of Max-K-sub-sequence【单调队列】