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:对不同的方法进行取舍以便可以得到最优结果时,努力去发现他们的共同点,如果他们根本是相同的,那么就可以把他们合并起来

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值