首页 > 代码库 > [leetcode-651-4 Keys Keyboard]
[leetcode-651-4 Keys Keyboard]
Imagine you have a special keyboard with the following keys:
Key 1: (A)
: Prints 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.
Example 1:
Input: N = 3 Output: 3 Explanation: We can at most get 3 A‘s on screen by pressing following key sequence: A, A, A
Example 2:
Input: N = 7 Output: 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
Note:
- 1 <= N <= 50
- Answers will be in the range of 32-bit signed integer.
思路:
要想N步生成最多个A,可在N-2步的时候,Ctrl A,N-1步的时候,Ctrl C,第N步的时候Ctrl V,这样就能将N-3步生成的A的个数,翻倍。
如何确定在第几步Ctrl A,然后再Ctrl C、Ctrl V呢,需要依次判断第i-3步之前的步骤。
得到递推公式 dp[i] = max(dp[i],dp[i-j-1]);dp[i]表示第i步生成的最多的A的个数。
int maxA(int N) { vector<int>dp(N+1); for(int i=0;i<=N;i++) { dp[i] = i; for(int j=0;j<=i-3;j++) { dp[i] = max(dp[i],dp[j]*(i-j-2+1)); } } return dp[N]; }
https://discuss.leetcode.com/topic/97628/java-4-lines-recursion-with-step-by-step-explanation-to-derive-dp
[leetcode-651-4 Keys Keyboard]