题目:http://acm.hdu.edu.cn/showproblem.php?pid=1003
输入N,r然后输入n个数字,求这些数字中的最大子段和,并标明起点终点。
Input:
2 5 6 -1 5 4 -7 7 0 6 -1 1 -6 7 -5
Sample Output
Case 1: 14 1 4 Case 2: 7 1 6
最后循环一遍找出max(dp[i]).打印起点和终点,终点就是i,往前找到起点。
#include<stdio.h>
#include<string.h>
int main()
{
int T,N,i,j,max=0;
int a[100010],b[100010];
scanf("%d", &T);
for(int m=1;m<=T;m++)
{
scanf("%d", &N);
memset(a, 0, sizeof(a));
memset(b, 0, sizeof(b));
for (i = 1; i <= N; i++)
{
scanf("%d", &a[i]);
}
b[1] = a[1];
for(i=2;i<=N;i++)
{
if (b[i - 1] < 0)
b[i] = a[i];//为a[i]本身
else b[i] = b[i - 1] + a[i];
}
max = 1;
for (i = 1; i <= N; i++)
{
if (b[max] < b[i])
max = i;
}
int sum = 0,l;
for (j = max; j > 0; j--)
{
sum += a[j];
if (sum == b[max])
l = j;
}
printf("Case %d:\n", m);
printf("%d %d %d\n", b[max], l, max);
if (m < T)
printf("\n");
}
return 0;
}