【最大連續子序列和dp】hdu 1003 Max Sum

http://acm.hdu.edu.cn/showproblem.php?pid=1003

最大連續子序列和,dp[i] = max(dp[i-1]+a[i],a[i]),注意維護st

/*
   hdu 1003 最大連續子序列和 dp
題意:
   給你n個數,找到最大的連續子序列,使得和最大,且能輸出它的起始、終止位置
思路:
   dp[i] = max(dp[i-1]+a[i],a[i]),dp[i]表示以i結尾的子序列的最大和
   期間維護一個maxx、st、end即可,st的維護要注意當st改變的時候要記錄
*/
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<vector>
#include<queue>
#include<set>
#include<map>
#include<algorithm>
#include<sstream>
#define eps 1e-9
#define pi acos(-1)
#define INF 0x7fffffff
#define inf -INF
#define MM 12900
#define N 110
using namespace std;
typedef long long ll;
const int _max = 1e5 + 10;

int a[_max],dp[_max];//dp[i]以第i個元素結尾的最大連續子序列和
int st,ent;

int main(){
    #ifndef ONLINE_JUDGE
    freopen("input.txt","r",stdin);
    #endif // ONLINE_JUDGE
    int T;cin>>T;int kase = 1;
    while(T--){
      int n;scanf("%d",&n);
      for(int i = 0; i < n; ++ i) scanf("%d",a+i);
      if(kase>1)printf("\n");//控制輸出
      memset(dp,0,sizeof(dp));
      dp[0]=a[0];
      st= ent = 0;
      int maxx = a[0];int t = 0;
      for(int i = 1;i < n; ++ i){//狀態轉移
        if(dp[i-1]+a[i]<a[i]){
            dp[i]=a[i];
            t = i;//開始位置需要記錄
        }
        else dp[i] = dp[i-1]+a[i];
       if(maxx<dp[i]) {
         maxx = dp[i];
         st = t;
         ent = i;
        }
      }
      printf("Case %d:\n",kase++);
      printf("%d %d %d\n",maxx,st+1,ent+1);
    }
    return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章