最大字段和 (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; }