题目来源:
http://acm.hdu.edu.cn/showproblem.php?pid=1231
http://acm.hdu.edu.cn/showproblem.php?pid=1003
话说虽然这是道简单的,但我这种菜鸟还是不会,本打算昨天晚上自己想想的,后来还是算了。
想不到今天早上醒来就顿悟了,就趁着思路把题目写了下,先做的是1231,wa了三遍,后来经过调试还是发现了错误。
写完1231后再看1003,简直是一样的题目嘛,就小改了下代码,提交一次就ac了。
状态转移方程:sum = sum > 0 ? sum + a[i] : a[i] ; 第一个sum是前i个数的和,后面的两个sum是前(i-1)个是的和;如果i前面的和是小于0的,那么加上第i个数肯定比i要小,所以只取第i个数即a[i],如果是大于0的,则就加上。
1231代码如下:
/*
本题的状态方程:sum = sum > 0 ? sum+a[i] :a[i];
*/
#include<stdio.h>
#define MAXN 10002
int a[MAXN];
int main()
{
int k, i, sum, ans, st, ed, y, x;
while(scanf("%d", &k), k)
{
for(i=0; i<k; i++)
{
scanf("%d", &a[i]);
}
sum = ans = st = ed = x = y =a[0];
for(i=1; i<k; i++)
{
if(sum > 0)
{
sum += a[i];
ed = a[i];
}
if(sum <= 0)
{
sum = a[i];
st = a[i];
ed = a[i];
}
if(sum > ans)
{
ans = sum;
x = st;
y = ed;
}
}
if(ans >= 0)
printf("%d %d %d\n", ans, x, y);
else
printf("%d %d %d\n", 0, a[0], a[k-1]);
}
return 0;
}
1003的代码只是在1231的基础上小改了下
#code 1003#
/*
本题的状态方程:sum = sum > 0 ? sum+a[i] : a[i];
*/
#include<stdio.h>
#define MAXN 100002
int a[MAXN];
int main()
{
int j, t, k, i, sum, ans, st, ed, y, x;
scanf("%d", &t);
for(j=1; j<=t; j++)
{
scanf("%d", &k);
for(i=0; i<k; i++)
{
scanf("%d", &a[i]);
}
sum = ans =a[0];
st = ed = x = y =0;
for(i=1; i<k; i++)
{
if(sum >= 0)
{
sum += a[i];
ed = i;
}
if(sum < 0)
{
sum = a[i];
st = i;
ed = i;
}
if(sum > ans)
{
ans = sum;
x = st;
y = ed;
}
}
printf("Case %d:\n%d %d %d\n", j, ans, x+1, y+1);
if(j!=t)
printf("\n");
}
return 0;
}