hdu1003---Max Sum

tips:

  1.最大子序列和,最大的那个子序列肯定是结束位置的

  2.关键是子序列开始的位置---什么时候要重新改变起点

  3.重叠子问题和递推

  //1 2 3 4

  //1

  //2 12

  //23 123----观察重叠子问题和递推

//动态规划处理最优化问题
//将原问题分解成子问题,综合子问题的解得到最优解
//重叠子问题,最优子结构(子问题的解也是最优的)无后效性
//自底向上解决问题
#include<cstdio>
#include<algorithm>
using namespace std;
const int M=100010;
int t;
int n;
int a[M];
int dp[M];
int main(){
    while(scanf("%d",&t)!=EOF){
        int cas=1;
        int flag=1;
        while(t--){
            scanf("%d",&n);
            for(int i=1;i<=n;i++){
                scanf("%d",&a[i]);
            }
            dp[1]=a[1];
            int L=1;
            int R=1;
            int start=1;
            int over=1;
            int ans=dp[1];
            for(int i=2;i<=n;i++){
                if(dp[i-1]+a[i]<a[i]){
                        dp[i]=a[i];
                        L=i;
                }
                else{
                    dp[i]=dp[i-1]+a[i];
                }
                if(dp[i] > ans){//当dp[x]<0时,改变记录的左端点,当dp[]往后积累到大于之前的最大值时,更新左端点和右端点
                    ans=dp[i];
                    start=L;
                    over=i;
                }

            }
            printf("Case %d:\n",cas++);
            printf("%d %d %d\n",ans,start,over);
            if(t)
            printf("\n");
        }
    }
    return 0;
}
View Code

 

posted @ 2018-08-23 18:48  SUMay  阅读(131)  评论(0编辑  收藏  举报