HDU 3415 Max Sum of Max-K-sub-sequence 最长K

系统 1654 0

链接: http://acm.hdu.edu.cn/showproblem.php?pid=3415

意甲冠军:环。要找出当中9长度小于等于K的和最大的子段。

思路:不能採用最暴力的枚举。题目的数据量是10^5,O(N^2)的枚举回去超时。本题採用的非常巧妙的DP做法,是用单调队列优化的DP。

运用的是STL的deque,从i:1~a找到以当中以i为尾的符合条件的子段。并将i本身放入双向队列。全部i从队列后放入,保证了队列的单调性。

代码:

      #include <iostream>
#include <cstdio>
#include <cstring>
#include <cctype>
#include <cstdlib>
#include <cmath>
#include <map>
#include <set>
#include <queue>
#include <stack>
#include <vector>
#include <ctype.h>
#include <algorithm>
#include <string>
#define PI acos(-1.0)
#define mem(a,b) memset(a,b,sizeof(a))
#define maxn 100005*2
#define maxm
#define INF 0x7fffffff
typedef long long ll;
using namespace std;
int num[maxn],sum[maxn];
int main()
{
    int tot;
    scanf("%d",&tot);
    while(tot--)
    {
        int a,b;
        scanf("%d%d",&a,&b);
        scanf("%d",&num[1]);
        sum[1]=num[1];
        for(int i=2;i<=a;i++)
        {
            scanf("%d",&num[i]);
            sum[i]=sum[i-1]+num[i];
        }
        for(int i=a+1;i<a+b;i++)
        sum[i]=sum[i-1]+num[i-a];
        deque < int > dd;
        int ans=-INF,head=-1,tail=-1;
        for(int i=1;i<a+b;i++)
        {
            while(!dd.empty()&&sum[i-1]<sum[dd.back()])
            dd.pop_back();
            while(!dd.empty()&&i>dd.front()+b)
            dd.pop_front();
            dd.push_back(i-1);
            if(sum[i]-sum[dd.front()]>ans)
            {
                ans=sum[i]-sum[dd.front()];
                head=dd.front()+1;
                tail=i;
            }
        }
        if(head>a)
        head-=a;
        if(tail>a)
        tail-=a;
        printf("%d %d %d\n",ans,head,tail);
    }
    return 0;
}

    


版权声明:本文博客原创文章,博客,未经同意,不得转载。

HDU 3415 Max Sum of Max-K-sub-sequence 最长K子段和


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论