一个序列,连续子序列和的最大值,以及左值和右值的下标(从0开始)。
如:
1 -3 -5 2 6 -1 4 9
下标3到7即从(2到9)之和最大,为20。
#include <iostream>
const int maxn=100;
using namespace std;
int ml, mr, l, r;
int max_sub_array(int x[], int n){
int ans;
int dp[maxn];
ans = dp[0] = x[0];
ml = mr = l = r = 0;
for (int i = 1; i <= n; ++i){
if (dp[i - 1] + x[i] < x[i]){
l = r = i;
dp[i] = x[i];
}
else{
++r;
dp[i] = dp[i - 1] + x[i];
}
if (ans < dp[i]){
ml = l;
mr = r;
ans = dp[i];
}
}
return ans;
}
int main()
{
int n=8,ans;
int a[maxn]={1 ,-3 ,-5 ,2 ,6 ,-1 ,4 ,9};
ans=max_sub_array(a,n);
cout<<ans<<endl<<ml<<" "<<mr<<endl;
return 0;
}
输出
20
3 7