思路是,用dp数组求出以每个数结尾的最大字段和存到dp里面(如果前一个dp大于0,那么dp就加上后一个a[i],如果前一个dp小于0,那么dp就从新开始,dp[i]=a[i]),然后求出dp数组中最大的数就是最大子段和
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
int main(){
ll n;
cin>>n;
ll a[n];
for(int i=0;i<n;i++){
cin>>a[i];
}
ll dp[n];
dp[0]=a[0];
for(int i=1;i<n;i++){
if(dp[i-1]>0){
dp[i]=dp[i-1]+a[i];
}else{
dp[i]=a[i];
}
}
cout<<*max_element(dp,dp+n); //找出dp数组中最大的数
return 0;
}