[leetcode-651-4 Keys Keyboard]

Posted hellowOOOrld

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[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. 1 <= N <= 50
  2. 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]的主要内容,如果未能解决你的问题,请参考以下文章

多个匹配的正则表达式.net c#

python中的列表和字典

json Visual Studio Code的默认键绑定。源代码来自干净的Insiders版本(2016-02-07),并被格式化为单个keyb

SQL Server 聚集索引 - 索引顺序问题

MongoDB中复合_id的预期行为?

BTree vs B+Tree 节点操作流程图解