题目:http://acm.hdu.edu.cn/showproblem.php?pid=1003
分析:
动态规划方程: sum[i] = max ( sum[i-1] + a[i] , a[i] )
s[i]中 s[i]是起点的值,i是终点的值
计算出的ans是终点的值。
代码:
#include<stdio.h>
#include<string.h>
using namespace std;
int a[100005];
int sum[100005];
int s[100005];
int main()
{
int t;int k=1;
scanf("%d",&t);
while(t--)
{
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
sum[0]=a[0];
s[0]=0;
int ans=0;
for(int i=1;i<n;i++)
{
if(sum[i-1]>=0)
{
sum[i]=sum[i-1]+a[i];
s[i]=s[i-1];
}
else
{
sum[i]=a[i];
s[i]=i;
}
if(sum[ans]<sum[i])
{
ans=i;
}
}
printf("Case %d:\n%d %d %d\n",k++,sum[ans],s[ans]+1,ans+1);
if(t!=0)
printf("\n");
}
}