hdoj 3415 Max Sum of Max-K-sub-sequence(单调队列+dp)

原创 2012年03月25日 00:37:50

【题目大意】:给出一个数组,把其首尾相接起来,然后给定k值,在这个数组(循环的)里找出最大子序列值(子列长度不超过k)


【解题思路】:我们很容易得到方程:ans[i]=sum[1,i]-min(sum[1,i-k]) ans[i]表示以i结尾的最大值。

   这样的复杂是O(n*k),是不符合题目给的要求的。

                   这里注意我们要把数组破环,即复制一遍。

   因此,我们可以想到用单调队列维护一个min,来达到优化的目的,使得复杂度降为O(n)                   

【代码】:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
#include <cmath>
#include <string>
#include <cctype>
#include <map>
#include <iomanip>
                   
using namespace std;
                   
#define eps 1e-8
#define pi acos(-1.0)
#define inf 1<<30
#define linf 1LL<<60
#define pb push_back
#define lc(x) (x << 1)
#define rc(x) (x << 1 | 1)
#define lowbit(x) (x & (-x))
#define ll long long

int que[200100],sum[200100];
int le,ri,n,k,p,q,maxx;
int main(){
    int T;
    cin >> T;
    while (T--){
        scanf("%d%d",&n,&k);
        for (int i=1; i<=n; i++){
            scanf("%d",&sum[i]);
            sum[i]+=sum[i-1];
        }   
        for (int i=n+1; i<=n+k; i++) sum[i]=sum[n]+sum[i-n];
        le=0;
        ri=-1;
        maxx=-inf;   
        for (int i=1; i<=n+k; i++){
            while (le<=ri && sum[que[ri]-1]>sum[i-1]) ri--;
            ri++;
            que[ri]=i;
            while (i-que[le]>=k) le++;
            if (sum[i]-sum[que[le]-1]>maxx){
                maxx=sum[i]-sum[que[le]-1];
                p=que[le];
                q=i;
            }
        }
        if (q>n) q=q-n;
        printf("%d %d %d\n",maxx,p,q);
    }
    return 0;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

HDU 3415 Max Sum of Max-K-sub-sequence - dp&单调队列优化

题目描述分析:环形要double转换为链状,再跑dp 记dp[i]表示以 i 为结尾的长度不超过k的最大连续子段和 dp[i]=max{sum[i]−sum[j]},i−k<=j<i dp[i] ...

hdu 3415 Max Sum of Max-K-sub-sequence 单调队列dp

Max Sum of Max-K-sub-sequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K...

hdu3415Max Sum of Max-K-sub-sequence(单调队列)

题意:给定一个长n的环形序列a[1]...a[n]。就是a[1]与a[n]是相邻的。问在这个环上取连续且不超过k长度的子序列,求所有满足条件 的子序列的的和的最大值。 思路:求一个前缀和,那么区间[i...

[ACM] hdu 3415 Max Sum of Max-K-sub-sequence (单调队列)

Max Sum of Max-K-sub-sequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K...

HDU 3415 Max Sum of Max-K-sub-sequence(单调队列)

双向队列

HDU 3415 Max Sum of Max-K-sub-sequence(单调队列)

/*AC 思路:使用sum[i]存储前i个序列之和,队列中存储区间内出现过最小序列和,这样只需要sum[i]前去最小序列和即可。 */ #include using namespace std; c...

单调队列-hdu-3415-Max Sum of Max-K-sub-sequence

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3415 题目大意: 给n个数凑成环状,求某一区间,使得该区间长度不超过k,且总和最大。 解...

HDU 3415 Max Sum of Max-K-sub-sequence(单调队列)

Given a circle sequence A11,A22,A33......Ann. Circle sequence means the left neighbour of A11 is Ann...

HDU - 3415 Max Sum of Max-K-sub-sequence : 单调队列

题目点此跳转思路 题目意思是给你一全环形的数组(头尾相接), 求所有长度不大于k的区间中 元素和 最大 的的区间 及 最大的元素和。 区间的和可以使用前缀和相减求出,设sum[i]为从0到i的前缀和,...

hdu3415 Max Sum of Max-K-sub-sequence 单调队列

Max Sum of Max-K-sub-sequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)