分治法
#include<bits/stdc++.h>
using namespace std;
#define N 2000
int a[N],n;
int find_maxcross(int l,int mid,int r){
int sum1 = 0,sum2 = 0;
int sum = 0;
for (int i = mid;i >= l;i--){
sum += a[i];
if(sum > sum1) sum1 = sum;
}
sum = 0;
for(int i = mid+1;i <= r;i++){
sum += a[i];
if(sum > sum2)sum2 = sum;
}
return sum1 + sum2;
}
int find_maxsub(int l,int r)
{
if (l == r)return a[l];
else{
int mid = (l + r)>>1;
int maxleft = find_maxsub(l,mid);
int maxright = find_maxsub(mid + 1,r);
int maxcross = find_maxcross(l,mid,r);
return max(max(maxleft,maxright),maxcross);
}
}
int main()
{
scanf("%d",&n);
for (int i = 1;i <= n;i++)scanf("%d",&a[i]);
if(n == 0)cout<<"0"<<endl;
else if(n == 1)cout<<a[1]<<endl;
else cout<<find_maxsub(1,n);
}
递推
#include<bits/stdc++.h>
using namespace std;
#define N 2000
int nums[N],n;
int main()
{
scanf("%d",&n);
for(int i = 1;i <= n;i++)scanf("%d",&nums[i]);
int sum_cur = 0;
int max_sum = 0;
for(int i=1;i<n;++i)
{
if(sum_cur < 0)
sum_cur = nums[i];
else
sum_cur += nums[i];
if(sum_cur > max_sum)
max_sum = sum_cur;
}
cout<<max_sum;
}
dp法
#include<bits/stdc++.h>
using namespace std;
#define N 2000
int nums[N],n;
int f[N];
int main()
{
scanf("%d",&n);int ans = 0;
for(int i = 1;i <= n;i++)scanf("%d",&nums[i]);
for (int i = 1;i <= n;i++){
f[i] = max(f[i],f[i-1]+nums[i]);
if(ans < f[i])ans = f[i];
}
cout<<ans<<endl;
}