[lintcode]867. 4 Keys Keyboard

本文介绍了一个特殊键盘的优化算法,该键盘包含四个特殊键:打印'A'、全选、复制和粘贴。通过数学推导和动态规划的方法,确定了在限定次数内能够打印的最大'A'数量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

链接:http://www.lintcode.com/zh-cn/problem/4-keys-keyboard/

Imagine you have a special keyboard with the following keys:

Key 1: (A): Print one 'A' on screen.

Key 2: (Ctrl-A): Select the whole screen.

Key 3: (Ctrl-C): Copy selection to buffer.

Key 4: (Ctrl-V): Print buffer on screen appending it after what has already been printed.

Now, you can only press the keyboard for N times (with the above four keys), find out the maximum numbers of 'A' you can print on screen.

 注意事项
  1. 1 <= N <= 50
  2. Answers will be in the range of 32-bit signed integer.
样例

Given N = 3, return 3.

Explanation: 
We can at most get 3 A's on screen by pressing following key sequence:
A, A, A

Given N = 7, return 9.

Explanation: 
We can at most get 9 A's on screen by pressing following key sequence:
A, A, A, Ctrl A, Ctrl C, Ctrl V, Ctrl V
思路:

首先把 DP[ i ] 初始化为 i,代表的情形是不使用复制粘贴操作。然后将 j 从3开始一直到 i-1,从3开始是为了确保至少有一个复制粘贴的操作。接着循环:"以dp[1] 中的所有字符为基准之后全是粘贴操作" 一直到 "以dp[i-3]中的所有字符为基准之后全是粘贴操作"。

比如:
A, A, A, Ctrl A, Ctrl C, Ctrl V, Ctrl V
这里 n = 7 ,我们使用了 3 (j=4,i-j=7-4)步来获得 AAA
接着我们使用 4 步: Ctrl A, Ctrl C, Ctrl V, Ctrl V, 来获得j - 1 = 4 - 1 = 3 份 AAA 的复制。

我们要么一点不使用copy操作,就是我们初始化 DP[ i ] 为 i 的情形。要么使用copy操作,这样我们要留3步给 Ctrl A, Ctrl C, Ctrl V ,所以 j 至少是 3.

得到公式 dp[ i ] = max ( dp[ i ] , dp[ i - j ] * ( j - 1 ) )      {  j in [ 3, i )  }



class Solution {
public:
    /**
     * @param N: an integer
     * @return: return an integer
     */
    int maxA(int N) {
        // write your code here
    
        vector<int> dp(N+1,0);
        for(int i=1;i<=N;i++)
        {
            dp[i]=i;
            for(int j=3;j<i;j++)
            {
                dp[i]=max(dp[i],dp[i-j]*(j-1));
            }
        }
        
        return dp[N];
        
    }
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值