1. 程式人生 > >Lintcode 67. 四鍵鍵盤

Lintcode 67. 四鍵鍵盤

假設你有一個特殊的鍵盤,鍵盤上有如下鍵:
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:對不同的方法進行取捨以便可以得到最優結果時,努力去發現他們的共同點,如果他們根本是相同的,那麼就可以把他們合併起來