做這題時我用malloc耗費了4224K,而換成固定大小的數組時縮小到了988K!
刪除#include <stdlib.h>之前耗時188MS,刪除之後耗時219MS:)
經過數次WA,終於AC了,在此簡述下思想。
這是一道典型的DP,先從左至右進行一次DP,把max值(即此元素之前的最大子數組和)存放在一個數組maxBef中,這樣數組中的每個元素就對應一個max值,此max值代表此元素之前(包括此元素)的最大子數組和。
然後再從右至左進行一次DP,每次循環求max與maxBef[i-1]相加的和,循環結束得到max+maxBef[i-1]的最大值,這個值就是答案:)
這樣的程序爲O(n)。之前想過一個方法,用一個循環,以每一個元素爲界限,再分別對界限兩邊的元素DP,這樣也沒錯,不過O(n*n),超時了:(
後來又經歷了一段WA,原因是沒有仔細注意到循環的界限,看來以後還是要仔細。
以下是代碼:
- #include <stdio.h>
- #include <stdlib.h>
- main(int argc, char *argv[])
- {
- //int *d, *maxBef;
- int d[100000], maxBef[100000];
- long sum, max, n, i, maxSum;
- freopen("POJ2593.TXT","r",stdin);
- while (scanf("%d", &n) && n!=0){
- //d=(int *)malloc(n*sizeof(int));
- //maxBef=(int *)malloc(n*sizeof(int));
- for (i=0; i<n; i++)
- scanf("%d", &d[i]);
- for (i=1, sum=max=d[0]; i<n; i++){//從左向右的一次DP,將每個數字之前的最大子數組之和存入到數組maxBef當中
- if (sum>0)
- sum+=d[i];
- else
- sum=d[i];
- if (max<sum)
- max=sum;
- maxBef[i]=max;
- }
- maxBef[0]=d[0];
- maxSum=(n>1) ? maxBef[n-2]+d[n-1] : d[0];//初始化maxSum
- for (i=n-2, sum=max=d[n-1]; i>0; i--){//從右向左的一次DP,將所得的max與maxBef相加
- if (sum>0)
- sum+=d[i];
- else
- sum=d[i];
- if (max<sum)
- max=sum;
- if ((max+maxBef[i-1])>maxSum)
- maxSum=max+maxBef[i-1];
- }
- printf("%d/n", maxSum);
- }
- //free(d);
- //free(maxBef);
- }