#include<bits/stdc++.h>
using namespace std;
#define ll long long
/*
给出一个整数序列S,其中有N个数,定义其中一个非空连续子序列T中所有数的和为T的“序列和”。
对于S的所有非空连续子序列T,求最大的序列和。
变量条件:N为正整数,N≤1000000,结果序列和在范围(-2^63,2^63-1)以内。
*/
int main(){
//显然是dp
int n;
while(cin>>n)
{ vector<ll>v(n,0);
vector<ll>dp(n,0);
for(int i =0;i<n;i++)//初始化dp
{
cin>>v[i];
}
ll maxnum=INT_MIN;
//dp[0]=max(0,dp[0]);
dp[0]=v[0];
for(int i=1;i<n;i++)
{
//对每个元素都有两个状态向量,选或者不选。
dp[i]=max(v[i],v[i]+dp[i-1]);
maxnum=max(maxnum,dp[i]);
}
cout<<maxnum<<endl;
}
return 0;
}
去掉一个辅助数组v,降低空间复杂度
#include<bits/stdc++.h>
using namespace std;
#define ll long long
/*
给出一个整数序列S,其中有N个数,定义其中一个非空连续子序列T中所有数的和为T的“序列和”。
对于S的所有非空连续子序列T,求最大的序列和。
变量条件:N为正整数,N≤1000000,结果序列和在范围(-2^63,2^63-1)以内。
*/
int main(){
//显然是dp
int n;
while(cin>>n)
{
vector<ll>dp(n,0);
for(int i =0;i<n;i++)//初始化dp
{
cin>>dp[i];
}
ll maxnum=INT_MIN;
for(int i=1;i<n;i++)
{
//对每个元素都有两个状态向量,选或者不选。
dp[i]=max(dp[i],dp[i]+dp[i-1]);
maxnum=max(maxnum,dp[i]);
}
cout<<maxnum<<endl;
}
return 0;
}