hdu1003 Max Sum【最大子段和】

题目链接:https://vjudge.net/problem/HDU-1003

 

题目大意:
给出一段序列,求出最大连续子段之和,以及给出这段子段的起点和终点。

解题思路:
最长连续子序列之和问题其实有很多种求解方式,这里是用时间复杂度为O(n)的动态规划来求解。

思路很清晰,用dp数组来表示前i项的最大连续子序列之和,如果dp[i-1]>=0的话,则dp[i]加上dp[i-1]能够使dp[i]增大;若dp[i-1]<0的话,则重新以dp[i]为起点,起点更新。

 

#include <bits/stdc++.h>
using namespace std;

#define RP(i,s,t) for(int i=s;i<=t;i++)
const int N = 1e5+5;
int dp[N];

int main(){
    int ncase=0;
    int n,T;cin>>T;
    while(T--){
        scanf("%d",&n);
        RP(i,1,n) scanf("%d",&dp[i]);
        dp[0]=-1;
        int mx=-2e9;
        int s,e,nows;
        s=e=nows=1;
        RP(i,1,n) {
            if(dp[i-1]>=0) dp[i]+=dp[i-1];
            else nows=i;
            if(mx<dp[i]){
                mx=dp[i];
                e=i;
                s=nows;
            }
        }
        printf("Case %d:\n",++ncase);
        printf("%d %d %d\n",mx,s,e);
        if(T) puts("");
    }
}

 

posted @ 2018-04-30 15:59  悠悠呦~  阅读(241)  评论(0编辑  收藏  举报
浏览器标题切换
浏览器标题切换end