http://acm.hdu.edu.cn/showproblem.php?pid=1003
求最大子段和问题,用动态规划即可解决。b[j] = max{b[j - 1] + a[j], a[j]}
代码如下:
#include <cstdio>
using namespace std;
const int N = 100001;
int a[N];
void max_sum(int a[], int n, int r);
int main()
{
int t, n, i, r, j;
scanf("%d", &t);
r = t - 1;
for(i = 1; i <= t; i++)
{
scanf("%d", &n);
for(j = 1; j <= n; j++)
{
scanf("%d", &a[j]);
}
max_sum(a, n, i);
if(r--)
{
printf("\n");
}
}
return 0;
}
void max_sum(int a[], int n, int r)
{
int i, b = 0, sum = a[1];
int i_left = 1, j_right = 1;
for(i = 1; i <= n; i++)
{
if(b > 0)
{
b += a[i];
}
else
{
b = a[i];
}
if(b > sum)
{
sum = b;
j_right = i;
}
}
b = 0;
for(i = j_right; i >= 1; i--)
{
b += a[i];
if(b == sum)
{
i_left = i;
break;
}
}
printf("Case %d:\n", r);
printf("%d %d %d\n", sum, i_left, j_right);
}