数据结构1 - 01-复杂度1 最大子列和问题
1 #include<stdio.h> 2 #define MAXK 1000000 3 int a[MAXK],dp[MAXK],k; 4 int main(){ 5 int i,maxsum; 6 scanf("%d",&k); 7 for(i=0;i<k;i++){ 8 scanf("%d",&a[i]); 9 } 10 dp[0] = a[0]; 11 for(i=1;i<k;i++){ 12 if(dp[i-1]+a[i]<a[i]){ 13 dp[i] = a[i]; 14 } 15 else dp[i] = a[i]+dp[i-1]; 16 } 17 maxsum = dp[0]; 18 for(i=0;i<k;i++){ 19 if(maxsum<dp[i]) maxsum = dp[i]; 20 } 21 if(maxsum<0) printf("0\n"); 22 else printf("%d\n",maxsum); 23 24 return 0; 25 }
对于这个问题,刚开始,使用的方法是将其分类:
dp[i]>0 ,a[i]>0;
dp[i]>0,a[i]<0;
dp[i]<0,a[i]>0;
ap[i]<0,a[i]<0;
到: dp[i]>0,a[i]>0 则 dp[i] = dp[i-1] + a[i] ; else dp[i] = a[i]
到发现忽略了一个问题:{8,4,3,-1,3,2,4}这样的序列不能得到满意的结果。