【最大连续子序列和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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值