linux程式設計的108種奇淫巧計 12 儲存計算

2021-08-25 13:34:58 字數 1056 閱讀 4649

有時候,我們可以將計算好的值進行儲存,需要的時候取出,這樣可以大大降低計算量,用空間代替時間。

我們從乙個問題出發,農夫john和他的朋友們一同去參加cownty展會,這個展會的門票是50元,排隊購票的人

有2n個人,其中n個人拿著100元的鈔票,另外n個人拿著50元的鈔票,農夫john想知道在這種情況下著2n個人共有

多少種排隊的方式,使得售票處在不準備零錢的情況下,也能把票賣給這2n個人,而不會出現找不開錢的局面。

這是乙個經典的組合問題,最後可以通過求解catalan數一步解決,我們這裡通過深入搜尋,寫通項和儲存計算三種方法來實現。

通過實現,儲存計算的這種方法最好,但需要對計算的順序精心設計。

在動態規劃等很多場合都會用到將計算儲存在乙個陣列中,此前的關於pfordelta的實現中也出現了將計算儲存在陣列中的方式,這是很常見的技巧,該問題前兩種方法只所以慢一方面是因為大量重複冗餘的計算,另一方面是過多的跳轉,通過第三種方法改寫後,計算的效率大大提高了,沒有組合數學背景的同學仔細研讀,應該也可以讀懂,該題來自吳文虎的《程式設計中的組合數學》,實現也部分參考了這本書,但有較多不同。

#include

#if defined(__i386__)

static __inline__ unsigned long long rdtsc(void)

#elif defined(__x86_64__)

static __inline__ unsigned long long rdtsc(void)

#endif

int all_n = 20;

int five_cnt = 10;

int ten_cnt = 10;

int dfs(int i,int change_cnt,int fi,int tj,int& all_cases_cnt)//fi表示拿50元鈔票的人數,tj表示拿100元鈔票的人數

else if(change_cnt == 0&&tj==0&&fi==1)

}else

} if(k==1)}}

} }};int f(int m,int n)

本系列其他文章閱讀:

nux程式設計的108種奇淫巧計 5 rbp暫存器

昨天在家瀏覽了紐約大學的乙個課件,找到乙個例子,很有趣,我稍微修改了一下,支援32位和64位環境 如下。以後該系列採用這樣的模式,首篇只貼 續篇進行解釋和分析,期間希望讀者朋友能自己做實驗。理解該 就算對rbp,rsp暫存器以及一些呼叫有了直接的接觸。裡面有兩個奇怪的數字17和23,這是為什麼呢?續...

關於linux程式設計的奇淫巧計系列的FAQ

自從發布linux程式設計的奇淫巧計系列以後,很多讀者給我寫來郵件,這裡我一併作答。1 你寫的內容有多少是實踐中可以用到的?還是只是花裡胡哨的東西?答 我負責的告訴你,大部分都是工程實踐中用到的,否則我哪能想到這麼些個花招,大部分都是我在工作實踐和知名開源 中看來得,如果有長期看開源 的朋友應該能體...

關於linux程式設計的奇淫巧計系列的FAQ

自從發布linux程式設計的奇淫巧計系列以後,很多讀者給我寫來郵件,這裡我一併作答。1 你寫的內容有多少是實踐中可以用到的?還是只是花裡胡哨的東西?答 我負責的告訴你,大部分都是工程實踐中用到的,否則我哪能想到這麼些個花招,大部分都是我在工作實踐和知名開源 中看來得,如果有長期看開源 的朋友應該能體...