简单DP

思路:统计以s[i]结尾的最大子序列和ans[i]

  • 关键找到递归关系:
  • ans[i]: s[i]结尾的最大子序列分为2类:是/否包含s[i-1]
  • ①不包含 前面序列对其没有贡献:ans[i]=s[i]
  • ②包含 前面序列对其有贡献:ans[i]=ans[i-1]+s[i]
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;

const int maxn=1000001;
const long long INF=0xffffffffffffffff;
long long s[maxn];//序列
long long ans[maxn];//以s[i]结尾的最大子序列和

long long  maxsequence(int n){
    long long maxans=INF;//最大序列和
    ans[0]=s[0];//起始
    for(int i=1;i<n;i++){
        ans[i]=max(s[i]+ans[i-1],s[i]);//递推
        maxans=max(maxans,ans[i]);//更新最大序列和
    }
    return maxans;
}

int main(){
    int n;
    while(scanf("%d",&n)!=EOF){
        fill(ans,ans+n,INF);//初始化
        for(int i=0;i<n;i++)scanf("%lld",&s[i]);
        printf("%lld\n",maxsequence(n));
    }
    return 0;
}