作者bleed1979 (十三)
看板C_and_CPP
標題Re: [討論] 令人印象深刻的遞迴問題?
時間Mon Apr 4 21:32:33 2011
我真是越來越糟糕了,拿掉 for 迴圈會快許多。
執行結果一樣。
程式碼:
http://paste.plurk.com/show/414616/
========================================================================
如果,我是說如果,不考慮 performance。
左買右賣,每一個價錢只有買,賣,不做動作三種可能。
進出場可超過一次。
我選擇 dfs,因為 coding 簡單容易除錯。
程式碼:
http://paste.plurk.com/show/414602/
執行結果:
158.97
55.39 buy
109.23 sell
48.29 buy
81.59 buy
81.58 buy
105.53 sell
94.45 pass
12.24 pass
如果考慮同一個價錢可賣掉之前的股份又買進目前的價位,
就變得複雜許多,自行研究吧。
※ 引述《curist (好問題..)》之銘言:
: ※ 引述《Ohwil ( )》之銘言:
: : 假設前面n個存在一個比較好的交易
: : 第i個時間買si 第k個時間賣sk, 價差sk-si k>i
: : 檢查第n+1個時間點是否可以賣
: : (不考慮買,因為你不知道會不會有n+2的時間點)
: : (如果可以賣,就把i,k的值換掉)
: : 只要在前面n個多存一個最小值 min_n 就可以達到O(n)
: : 應該就是遞迴的思考了吧?
: 哇..再來獻醜一次,這次用Ohwil大大的演算法,應該寫對了吧?
: #include <stdio.h>
: #include <stdlib.h>
: int main()
: {
: double prices[] = {55.39, 109.23, 48.29, 81.59,
: 81.58, 105.53, 94.45, 12.24};
: double min = 9999, max_diff = 0;
: int i;
: for(i = 0; i < 8; i++) {
: if(prices[i] < min) {
: min = prices[i];
: }
: if((prices[i] - min) > max_diff) {
: max_diff = prices[i] - min;
: }
: }
: printf("%lf\n", max_diff);
: return 0;
: }
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 114.43.118.223
→ firejox:每個時間點可買的股份數呢?? 04/04 21:37
→ bleed1979:設定單位1 unit。 04/04 21:38
※ 編輯: bleed1979 來自: 114.43.118.223 (04/04 21:45)
→ firejox:我覺得要賣掉之前的再買進當下的有點難... 04/04 21:52
→ firejox:因為不太可能... 04/04 21:53
推 yauhh:好想法 04/04 22:36
推 ericinttu:48.29 buy, 81.59 buy, 81.58 buy, 105.53 sell 04/05 00:16
→ ericinttu:這樣的結果像是每天買進張數有限制的作法. 04/05 00:17
→ yauhh:或許原題加一點限制變另一個題目:找出第二高獲利的買賣點 04/05 00:30
→ firejox:也可以限制進場次數 04/05 00:57
→ tropical72:設「初始資金」可能會實際些 XD 04/05 02:41