不知为啥经常忘记这个板子,总出差错
我们让sum等于 以a[ i ]为结束的 最大连续子段和
因为是以a[ i ]为结束且是连续子段 那么sum 要么就是 a[ i ]本身 要么 就是a[ i ] + 以a[ i-1 ]为结束的最大连续字段和 也就是 sum+a[i]
所以 状态转移方程出来了 sum= max( a[i], sum+a[i] )
代码
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
void solve()
{
ll n;cin>>n;
vector<ll>a(n+1);
for(ll i=1;i<=n;i++)cin>>a[i];//可以不用数组存的,优化空间
ll ans=-1e18,sum=a[1];
for(ll i=2;i<=n;i++)
{
sum=max(a[i],sum+a[i]);//状态转移方程,如果为a[i]则更新最大值初始点,不是则继续扩大区间
ans=max(ans,sum);//更新区间最大
}
cout<<ans<<'\n';
}
//-----------------------------------------------------------------------------------------
int main()
{
//ll t = 1 ;
//cin >> t ;
//for(ll i = 1 ; i <= t ; i++){
// cout << "Case #" << i << ": ";
solve();
//cout<<'\n';
//}
}