分治法
#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;
}