最大欄位和 衝出暴力列舉
這篇解題報告是對我最近一些題的總結,裡面的程式碼都是我解題,優化,再優化的過程的記錄,記錄了自己對演算法的完善與優化思路,還有對程式設計哲學的理解:do it,do it well。
很感謝孫老師您,讓自己可以找到利用計算機作比只是單純玩遊戲更有意義又更有趣的事情,又通過您的課,通過照著您給的路自己不斷探索,感覺自身能力得到了很大的提升,從當時一個小程式漏洞百出,思路拙劣,對oj系統的不熟悉,甚至當時上課時平時的練習和考試都讓自己感覺不盡人意,到現在自己不斷地追求完善程式碼完善思路,追求完美追求最優,雖然還是拙劣但是感覺自己在努力,感覺在自己現有的知識程度上已經做的很美了,這種在心裡湧上的孜孜不倦的追求的感覺讓自己感覺到了人生的意義,正如歌德在《浮士德》裡所表達的主題一樣,完善的境界永遠不可及,人類所能達到的最高成就,恰在於一種自強不息的創造性生活本身,一種不斷進步的道路與過程本身。
好了,說了那麼多,該切入正題了,審視自身的努力,反思自己的不足,就可以很清楚的一個菜鳥標準的特徵是:耗時費力的暴力列舉浪費了大量資源,永遠不變的單一的選擇排序,不自覺暴露出的goto使用……所以我今天借三個同樣是關於求出最優解的問題,來說明我是怎麼衝出暴力列舉。
第一個問題,很簡單,是ustcoj上的1389,連續子陣列的和,題目大意如下:輸入一個整型陣列,數組裡有正數也有負數。陣列中連續的一個或多個整陣列成一個子陣列,每個子陣列都有一個和。求所有子陣列的和的最大值。(數組裡的元素可正可負)
想都不用想,直接暴力列舉,太容易了,且只是個o(n^2)的演算法,由於n小於5000,必然不用當心超時,直接用暴力列舉就可以過了,看程式碼:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
#include
<stdio.h>
#define
max 5000
int
a[max+1];
int
qiuzhi( int
n) //列舉所有的情況,返回裡面的最大值
{
int
i,j,ans,temp;
ans=a[0];
for
|