最大连续子段和+记录路径 【DP 初步】

来源:互联网 发布:表单验证js 编辑:程序博客网 时间:2024/06/08 00:50

第1行:整数序列的长度N(2 <= N <= 50000)
第2 - N + 1行:N个整数(-10^9 <= A[i] <= 10^9)

输出

输出最大子段和,并且输出路径

输入示例

6
-2
11
-4
13
-5
-2

输出示例

20

代码

#include<bits/stdc++.h>#define LL long longusing namespace std;const int MAXN = 50000+10;const int MAXM = 1e5;const int inf=0x3f3f3f3f;LL arr[MAXN];LL max(LL a,LL b){    if(a>b) return a;    return b; } int main(){    int n;scanf("%d",&n);    for(int i=1;i<=n;i++) scanf("%lld",&arr[i]);    int st=1,ed=1;    LL maxval=0;LL dp=arr[1];    for(int i=2;i<=n;i++){        if(dp<0)  st=ed=i;// 说明重新开始记录        dp=max(dp,0)+arr[i];        if(maxval<dp){// 说明末尾延长了            ed=i;         }        maxval=max(maxval,dp);    }    for(int i=st;i<=ed;i++)         printf("%d ",arr[i]);    printf("\n%lld\n",maxval);    return 0;}
原创粉丝点击