记忆递归法:
#include <iostream>
#include <climits>
#include <cstring>
#include <algorithm>
const long INF = LONG_MAX;
using namespace std;
long long a[1000005];
long long memo[1000005]; //记录已经计算过的数值
long long fun(long n){
if(memo[n]>0)
return memo[n];
else{
int answer;
if(n==0)
answer=a[0];
else{
answer=max(a[n],fun(n-1)+a[n]);
}
memo[n]=answer;
return answer;
}
}
int main(){
long n;
while(scanf("%ld",&n)!=EOF){
for(long i=0;i<n;i++){
scanf("%lld",&a[i]);
}
fill(memo,memo+n,-1);
long long mx=-INF;
for(long i=0;i<n;i++){
if(fun(i)>mx)
mx=fun(i);
}
cout<<mx<<endl;
}
return 0;
}
循环法:
#include <iostream>
#include <climits>
#include <cstring>
#include <algorithm>
const long INF = LONG_MAX;
using namespace std;
long long a[1000005];
long long memo[1000005];
int main(){
long n;
long long answer;
while(scanf("%ld",&n)!=EOF){
for(long i=0;i<n;i++){
scanf("%lld",&a[i]);
}
long long mx=-INF;
memset(memo,0,sizeof(memo));
for(long i=0;i<n;i++){
if(i==0)
memo[0]=a[0];
else{
answer=max(a[i],memo[i-1]+a[i]);
memo[i]=answer;
}
}
for(long k=0;k<n;k++){
mx=max(mx,memo[k]);
}
cout<<mx<<endl;
}
return 0;
}