POJ2593

發現malloc動態內存分配很耗內存!
做這題時我用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,原因是沒有仔細注意到循環的界限,看來以後還是要仔細。
以下是代碼:
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. main(int argc, char *argv[])
  4. {
  5.     //int *d, *maxBef;
  6.     int d[100000], maxBef[100000];
  7.     long sum, max, n, i, maxSum;
  8.     freopen("POJ2593.TXT","r",stdin);
  9.     while (scanf("%d", &n) && n!=0){
  10.         //d=(int *)malloc(n*sizeof(int));
  11.         //maxBef=(int *)malloc(n*sizeof(int));
  12.         for (i=0; i<n; i++)
  13.             scanf("%d", &d[i]); 
  14.         for (i=1, sum=max=d[0]; i<n; i++){//從左向右的一次DP,將每個數字之前的最大子數組之和存入到數組maxBef當中
  15.             if (sum>0)
  16.                 sum+=d[i];
  17.             else
  18.                 sum=d[i];
  19.             if (max<sum)
  20.                 max=sum;
  21.             maxBef[i]=max;
  22.         }
  23.         maxBef[0]=d[0];
  24.         maxSum=(n>1) ? maxBef[n-2]+d[n-1] : d[0];//初始化maxSum        
  25.         for (i=n-2, sum=max=d[n-1]; i>0; i--){//從右向左的一次DP,將所得的max與maxBef相加
  26.             if (sum>0)
  27.                 sum+=d[i];
  28.             else
  29.                 sum=d[i];
  30.             if (max<sum)
  31.                 max=sum;
  32.             if ((max+maxBef[i-1])>maxSum)
  33.                 maxSum=max+maxBef[i-1];
  34.         }
  35.         printf("%d/n", maxSum);
  36.     }
  37.     //free(d);
  38.     //free(maxBef);
  39. }

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章