其实用DP思想这个很容易解决,
不过对于DP思想其实也不是很了解,但是算是肤浅的理解了其应用和思想吧。
下面是AC的代码:
#include <iostream>
using namespace std;
const int MAXLIMIT=1000;
int main()
{
int times;
cin>>times;
int arr[MAXLIMIT];
int j=1;
while(j<=times)
{
int numbers;
cin>>numbers;
int max;//tempMax;
cin>>max;
int tempMax=max;//读取第一个数
int pos;//记录当前起点
int start;//记录最大子序列起点
int end;//最大子序列终点
pos=start=end=0;//令当前起点以及终点均为0
for(int i=1;i<numbers;i++)//因为已经读了第一个数,所以现在开始读的下标应为1,假设这一组数字是在数组里面,存在下标一说
{
int temp;
cin>>temp;//读取这一个数字
if(tempMax+temp<temp)//如果tempMax+temp<temp的时候,说明tempMax<0,这时候,新的子序列开始了
//之所以不写成tempMax<0用于判断,是因为有可能整个子序列都是负的
{
pos=i;//记录当前的位置
tempMax=temp;//重置tempMax
}
else
{
tempMax+=temp;//如果tempMax>0,说明前面的子序列还有继续加下去的价值
}
if(max<tempMax)//如果max重置
{
start=pos;
end=i;
max=tempMax;
}
}
cout<<"Case "<<j<<":"<<endl;
cout<<max<<" "<<start+1<<" "<<end+1<<endl;//从上面看出,start+1才是最大的子序列值
if(j!=times)
cout<<endl;
j++;
}
return 0;
}