最大子段和问题
涉及算法:动态规划
思路:先求出序列中从开头到第1(2,3,4...n)个元素结尾的子段的最大子段和,整个序列的最大子段和肯定在其中;
比较就可以确定序列的最大子段和;最后确定最大子段的开头和结尾元素。
#include <iostream>
#include <climits>
using namespace std;
int main()
{
int a[10000], n, i, maxa[10000], Max=-INT_MAX, first=0, last=0;
cin>>n;
for(i=0;i<n;i++)
cin>>a[i];
maxa[0]=a[0];
for(i=1;i<n;i++)//maxa[i]表示以i结尾的字符串的最大子段和
if(maxa[i-1]<0)
maxa[i]=a[i];
else
maxa[i]=maxa[i-1]+a[i];
for(i=0;i<n;i++)
if(Max<maxa[i]){
Max=maxa[i];
last=i;
}
for(int j=0;j<=last;j++){
int x=0;
for(i=j;i<=last;i++)
x+=a[i];
if(x==Max){
first=j;
break;
}
}
if(Max<0){
Max=0;
first=0;
last=n-1;
}
cout<<Max<<" "<<a[first]<<" "<<a[last]<<endl;
return 0;
}