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

Max Sum of Max-K-sub-sequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K...
  • cyendra
  • cyendra
  • 2013年04月23日 16:46
  • 789

hdoj 3415 Max Sum of Max-K-sub-sequence 【单调队列】

题目链接:hdoj 3415 Max Sum of Max-K-sub-sequence Max Sum of Max-K-sub-sequence Time Limit: 2000/1000 M...
  • chenzhenyu123456
  • chenzhenyu123456
  • 2016年05月07日 14:50
  • 363

HDOJ 3415 Max Sum of Max-K-sub-sequence

【题意】给定一个环形数组,求数组中连续长度不超过 K 的最大子段和。 【分析】 1. 题目中给定的是环形数组,其实可以在数组尾部复制一份原数据,于是把问题规模扩大到了 2 * N,但是方便...
  • just_sort
  • just_sort
  • 2016年04月21日 18:28
  • 470

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...
  • WEYuLi
  • WEYuLi
  • 2014年03月10日 15:58
  • 505

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

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

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

单调队列:  一、 什么是单调(双端)队列 单调队列,顾名思义,就是一个元素单调的队列,那么就能保证队首的元素是最小(最大)的,从而满足动态规划的最优性问题的需求。 单调队列,又名双端队列。双端...
  • Job_yi
  • Job_yi
  • 2013年08月07日 09:08
  • 483

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

题目在此 N个数,围成一个环,求最大子段和,但数的个数不能超过K; 这让我想起了地大比赛的那道题,只不过地大比赛的那道数的个数没有限制。当时Wiking的做法是先把数组扩展一倍,然后按照普通最...
  • Zhuhuangjian
  • Zhuhuangjian
  • 2013年07月17日 17:22
  • 627

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

本题又是一题单调队列题解。 技巧就是需要计算好前n项和Sn = a1 + a2 + ... an 这样方便处理。 记录一条单调队列,其意义是: q(head), q(head+1), ...q(...
  • kenden23
  • kenden23
  • 2014年07月09日 19:14
  • 761

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

点我看题 题意:给你一个循环序列A1,A2,A3......An,让求长度小于等于k的连续子序列,这个子序列的和最大. 分析:一般给出循环序列让求一些东西的话,都会把这个序列扩展成长度为原序列两倍...
  • cherish0222
  • cherish0222
  • 2017年07月14日 15:50
  • 91

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...
  • smz436487
  • smz436487
  • 2014年08月28日 13:53
  • 243
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:hdoj 3415 Max Sum of Max-K-sub-sequence(单调队列+dp)
举报原因:
原因补充:

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