最大字段和 (DP)
题目略。能看到这篇文章的肯定知道题目。
核心代码就3句,但是涉及的思想需要弄清楚。我都写在代码中的注释了。
CODE:
#include<stdio.h>
int a[1000001];
int maxsum(int x[],int n);
int main()
{
int T,n,i;
scanf("%d",&T);
do
{
scanf("%d",&n);
for(i = 0 ; i < n ; ++i)
scanf("%d",&a[i]);
printf("%d\n",maxsum(a,n));
}while(--T);
// system("pause");
return 0;
}
int maxsum(int x[],int n)
{
int i,b = 0,k = -10000000;
for(i = 0 ; i < n ; ++i)
{
if(b > 0) b += x[i];//如果累加和是正数,则继续加
/*
如果b <= 0,那么一定有x[i-1]<0,x[i]待定,那么如果x[i]>= 0时,
b=x[i]是理所当然的;如果x[i]<0呢?b=x[i]合适吗?答案是合适。
因为下一次循环b依然小于0,肯定可以找到一个大于0的数
还有一个问题:b = x[i],那不就想当然把刚才那个字段全部舍弃了吗?
如果刚才那个子段的子段(前几个为负数)大于0呢?但这是不可能的。
因为一个字段的第一个数一定是个正数,因为如果第一个数是负数,
那么b<0,会执行else,直到有个正数出现,才会开始一个子段的累加
*/
else b = x[i];//如果累加和是负数了,就把这个值赋值给b
if(b > k) k = b;//更新最大字段和
}
return k;
}

浙公网安备 33010602011771号