DP水题,以前做过,之所以重做事因为原来并没有理解状态转移方程的意义。今天才恍然明白。
令sum表示以i-1个元素结尾的最大连续字段和,则当sum>0时,sum+=a[i],否则sum=a[i];
因为当sum>0时sum加上当前值a[i]肯定比a[i]要大,而Sum<0时肯定要小,所以sum<0时,sum=a[i]。
#include <stdio.h>
int main()
{
int n, sum, ans, st, ed, x, y, a[10005];
while(scanf("%d", &n), n)
{
for(int i = 0; i < n; i++)
scanf("%d", &a[i]);
ans = sum = x = y = st = ed = a[0];
for(int i = 1; i < n; i++)
{
if(sum > 0) sum += a[i], ed = a[i];
else sum = a[i], st = ed = a[i];
if(sum > ans)
{
ans = sum;
x = st, y = ed;
}
}
if(ans < 0) ans = 0, x = a[0], y = a[n - 1];
printf("%d %d %d\n", ans, x, y);
}
return 0;
}