Lintcode 67. 四鍵鍵盤
阿新 • • 發佈:2018-11-04
假設你有一個特殊的鍵盤,鍵盤上有如下鍵:鍵
1
:(A):在螢幕上列印一個'A'。鍵
2
:(Ctrl-A):選擇整個螢幕。鍵
3
:(Ctrl-C):複製選擇到緩衝區。鍵
4
:(Ctrl-V):在螢幕上已有的內容後面追加列印緩衝區的內容。
現在,你只能按鍵盤上N次(使用以上四個鍵),找出你可以在螢幕上列印的“A”的最大數量
這道題鑽牛角尖了,直接貼上大佬解法
dalao解法
public int maxA(int N) { // run a test case, n = 7 int[] dp = new int[N + 1]; Arrays.fill(dp, Integer.MIN_VALUE); for(int i = 0; i <= 6; i ++){ dp[i] = i; } for(int i = 7; i <= N; i ++){ for(int j = 3; j <= i - 3; j ++){ dp[i] = Math.max(dp[i], dp[i - j] * (j - 1)); } } return dp[N]; }
之前的思路一直在考慮何時該直接ctrl v 何時該更想你緩衝區ctrl a ctrl c 再ctrl v但無論是直接貼上還是複製貼上,我忽略了一個根本的相同點,那就是他們都是貼上,所以問題就轉變為,該從n前的哪個數開始一直貼上,然後留三步操作作為全選複製貼上。
我們要麼一點不使用copy操作,就是我們初始化 DP[ i ] 為 i 的情形。要麼使用copy操作,這樣我們要留3步給 Ctrl A, Ctrl C, Ctrl V ,所以 j 至少是 3.
summary:對不同的方法進行取捨以便可以得到最優結果時,努力去發現他們的共同點,如果他們根本是相同的,那麼就可以把他們合併起來