最大子段和
题解:考虑以 j j j为结尾的最大子段和。所以有 d p [ j ] = m a x ( a [ j ] , d p [ j − 1 ] + a [ j ] ) dp[j] = max(a[j],dp[j - 1] + a[j]) dp[j]=max(a[j],dp[j−1]+a[j])。最后遍历一遍即可。但是实际上发现可以用两个变量代替。
代码
#include<bits/stdc++.h>
using namespace std;
int a[200100];
int main()
{
#ifndef ONLINE_JUDGE
freopen("input.in","r",stdin);
#endif
int n;
cin>>n;
for(int i = 1; i <= n; ++i) {
cin>>a[i];
}
int sum = a[1], thisSum = 0;
for(int i = 1; i <= n; ++i) {
thisSum += a[i];
if(thisSum > sum)
sum = thisSum;
else if(thisSum < 0)
thisSum = 0;
}
cout<< sum <<endl;
return 0;
}