//老师叫我把以前写过的题目都写成题解,没办咯,
//懒惰如我(*^__^*) 嘻嘻……
//先从简单的开始吧
题意:
给定一个序列,求序列中的最大的字段和;
这个是道很经典的DP的问题
首先还是先定义DP的状态吧
DP[I]:前I个数字中最大的子段和;
那么易得如果DP[I-1]<0,那么DP[I]=A[I];
如果DP[I-1]>=0,DP[I]=DP[i-1]+A[I];
这样状态方程就写出来了;
#include<iostream>
#include<string.h>
using namespace std;
int main()
{
int t,cnt=0;
cin>>t;
while(t--)
{
int n,dp[100001],a[100001],i;
memset(dp,0,sizeof(dp));
memset(a,0,sizeof(a));
cnt++;
cin>>n;
for(i=1;i<=n;i++)
cin>>a[i];
dp[1]=a[1];
for(i=2;i<=n;i++)
{
if(dp[i-1]<0)
dp[i]=a[i];
else
dp[i]=dp[i-1]+a[i];
}
int max=dp[1],max1=1;//求最大子段和开始的地方和结束的地方
for(i=2;i<=n;i++)
{
if(dp[i]>max)
{
max=dp[i];
max1=i;
}
}
// cout<<max<<endl;
int flag=1;
for(i=max1-1;i>=1;i--)
{
if(dp[i]<0)
{
break;
}
}
cout<<"Case "<<cnt<<":"<<endl;
cout<<max<<" "<<i+1<<" "<<max1<<endl;
if(t)
cout<<endl;
}
}