3001
2 5 6 -1 5 4 -7 7 0 6 -1 1 -6 7 -5
Case 1: 14 1 4 Case 2: 7 1 6
对于给出的一个序列,求它的子序列的最大和;即求最大子序列的问题;
思路:对于总体的最大和,可以想成是求局部的最大和;
对于每一个数,可以认为是一个独立的最大和或者是把它当成前面已经求得的最大和的增量;
求得第一个最大和并且保存起来,然后依次求出局部最大和,就可以得到总体的最大和;
AC代码:
#include <iostream>
using namespace std;
int get(int data[] , int &l , int &r , int dl)
{
int max = -10000000 ;
l = 0 ;
r = 0 ;
int t = 1 ;
int mt = 0 ;
for(int i = 0 ; i < dl ; i++)
{
mt = mt +data[i];
if(mt > max)
{
max = mt;
l = t ; r = i+1 ;
}
if(mt < 0)
{
mt = 0 ;
t = i+2 ;
}
}
return max ;
}
int main()
{
int num ;
cin >> num ;
for(int k = 1 ; k <= num ;k++)
{
int lg = 0 ;
cin >>lg ;
int * data = new int[lg];
for(int i =0 ;i < lg ; i++)
{
cin >>data[i];
}
int l = 0 , r = lg-1 ;
int max = 0 ;
max = get(data , l , r , lg);
cout<<"Case "<<k<<":"<<endl;
cout<<max<<" "<<l<<" "<<r<<endl;
if(k!=num)
cout<<endl;
}
return 0 ;
}