题目来源:http://acm.hdu.edu.cn/showproblem.php?pid=1003
动态规划入门 dp[i]=max(0,dp[i-1]);
本题还应该注意:
最大字段和的起止位置,
有很多案例,以第一个为准。
切记:核心代码部分,万万不要把if(sum>max) 和if(sum<0)
调换位置,至于为什么,仔细想想。
用测试数据说明问题:
input
1
4 2 3 -5 6
output
Case 1:6 1 4
#include<iostream>
using namespace std;
#define Min -999999
int main()
{
int data[100000];
int start,end;
int step=1;
int m;
cin>>m;
while(m--)
{
int n;
cin>>n;
for (int i=1; i<=n;i++)
cin>>data[i];
int max = Min;
int k=1;
int sum = 0;
for (i=1; i<=n; i++)
{
sum = sum + data[i];
if (sum > max)
{
max = sum;
start=k;
end=i;
}
if(sum<0)
{
sum=0;
k=i+1;
}
}
cout<<"Case "<<step<<":"<<endl;
cout<<max<<" "<<start<<" "<<end<<endl;
step++;
if(m)
cout<<endl;
}
return 0;
}