[LeetCode] 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.

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.

这道题给了我们四个操作,分别是打印A,全选,复制,粘贴。每个操作都算一个步骤,给了我们一个数字N,问我们N个操作最多能输出多个A。我们可以分析题目中的例子可以发现,N步最少都能打印N个A出来,因为我们可以每步都是打印A。那么能超过N的情况肯定就是使用了复制粘贴,这里由于全选和复制要占用两步,所以能增加A的个数的操作其实只有N-2步,那么我们如何确定打印几个A,剩下都是粘贴呢,其实是个trade off,A打印的太多或太少,都不会得到最大结果,所以打印A和粘贴的次数要接近,最简单的方法就是遍历所有的情况然后取最大值,打印A的次数在[1, N-3]之间,粘贴的次数为N-2-i,加上打印出的部分,就是N-1-i了,参见代码如下:

解法一:

class Solution {

public:
    int maxA(int N) {
        int res = N;
        for (int i = 1; i < N - 2; ++i) {
            res = max(res, maxA(i) * (N - 1 - i));
        }
        return res;
    }
}; 

这道题也可以用DP来做,我们用一个一维数组dp,其中dp[i]表示步骤总数为i时,能打印出的最多A的个数,初始化为N+1个,然后我们来想递推公式怎么求。对于dp[i]来说,求法其实跟上面的方法一样,还是要遍历所有打印A的个数,然后乘以粘贴的次数加1,用来更新dp[i],参见代码如下:

解法二:

class Solution {

public:
    int maxA(int N) {
        vector<int> dp(N + 1, 0);
        for (int i = 0; i <= N; ++i) {
            dp[i] = i;
            for (int j = 1; j < i - 2; ++j) {
                dp[i] = max(dp[i], dp[j] * (i - j - 1));
            }
        }
        return dp[N];
    }
};

这道题还有个O(1)时间复杂度的解法,好像利用了数学知识,不过博主貌似没太理解,参见这个帖子,哪位大神给博主讲解一下?

参考资料:

https://discuss.leetcode.com/topic/97764/o-1-time-o-1-space-c-solution-possibly-shortest-and-fastest

https://discuss.leetcode.com/topic/97628/java-4-lines-recursion-with-step-by-step-explanation-to-derive-dp

本文转自博客园Grandyang的博客,原文链接:[LeetCode] 4 Keys Keyboard 四键的键盘

,如需转载请自行联系原博主。

时间: 2024-10-18 20:15:04

[LeetCode] 4 Keys Keyboard 四键的键盘的相关文章

[LeetCode] 2 Keys Keyboard 两键的键盘

Initially on a notepad only one character 'A' is present. You can perform two operations on this notepad for each step: Copy All: You can copy all the characters present on the notepad (partial copy is not allowed). Paste: You can paste the character

winform-C# Winform项目中,如何实现响应键盘的Tab键以及键盘的回车键

问题描述 C# Winform项目中,如何实现响应键盘的Tab键以及键盘的回车键 C# Winform项目中,有个form窗体,在form窗体中有一个Panel控件, 在Panel控件中包函六个Label控件(label1.label2.label3.label4.label5.label6),这六个Label控件从上到下排成一列. 如何实现以下两个功能: 1.如何实现通过点击键盘的Tab键可以实现从上到下的依次移动选择六个Lable控件. 2.在选中对应的Label控件后,如何实现点击键盘的回

WPF and Silverlight学习笔记(十四):键盘输入、鼠标输入、焦点处理

一.键盘类和键盘事件 WPF提供了基础的键盘类 (System.Input.Keyboard类),该类提供与键盘相关的事件.方法和属性,这 些事件.方法和属性提供有关键盘状态的信息.Keyboard的事件也通过 UIElement等XAML基元素类的事件向外提供. 对于键盘操作,其常用的事 件有两组: KeyDown事件和PreviewKeyDown事件:处理键盘键按下 KeyUp事件和PreviewKeyUp事件:处理键盘键抬起 其中KeyDown和 KeyUp事件属于冒泡路由事件,而Prev

怎么在win7下开启键盘鼠标键用键盘来控制鼠标移动呢?

  第一.打开鼠标键 (1)按Ctrl+Esc组合键打开开始选单,按S键然后按C键打开控制面板; (2)按方向键移动到"辅助选项",按回车键打开它的属性对话框; (3)按Ctrl+Tab组合键切换到"鼠标"页,按Alt+M组合键选中"使用鼠标键"选项; (4)按Alt+S组合键进入鼠标键设置对话框,按Alt+T选中"最高速度"项,然后按右方向键将其调至最大,同理,将"加速"项调至最大; (5)按两次回车键退

win7开启键盘鼠标键用键盘来控制鼠标的移动

  启用鼠标键就是用用键盘来控制鼠标的移动,在Windows7系统中这个选项在控制面板的轻松访问中心--使键盘更易于使用中,下面是图文说明: 打开控制面板--轻松访问 选择更改键盘的工作方式 选择使用键盘控制鼠标 1.打开鼠标键 (1)按Ctrl+Esc组合键打开开始选单,按S键然后按C键打开控制面板; (2)按方向键移动到"辅助选项",按回车键打开它的属性对话框; (3)按Ctrl+Tab组合键切换到"鼠标"页,按Alt+M组合键选中"使用鼠标键&quo

FLASH中响应键盘事件的四种方法

响应 响应键盘的方法作为AS中的一个重要组成部分,在如今已经越来越广泛的使用,尤其是在 FLASH游戏制作中,如果缺少了响应键盘的方法,那是不可能的,而响应键盘的方法主要的四种,分别是: 1.利用按钮进行检测 2.利用KEY对象 3.利用键盘侦听的方法 4.利用影片剪辑的keyUp和keyDown事件来实现响应键盘 只有熟练掌握了这些方法,然后加以变通的话,就会得到很多意想不到的效果,下面我就结合理论和自己的想法简要的介绍一下. 第一种响应键盘的方法:利用按钮进行检测来实现响应键盘 在按钮的on

WPF获取键盘状态(如WPF组合键)

对于键盘事件(PreviewKeyDown,KeyDown,PreviewKeyUp,KeyUp)获取组合键等键盘信息比较容易 1.KeyEventArgs对象包含一个KeyStates属性,该属性反映触发事件的键的属性 2.KeyboardDevice属性为键 盘上的所有键提供了相同的信息,自然也提供了一个KeyboardDevice类的一个实例.它的属性包括当前是哪个元素具有焦点,以及当事件发生时按下了哪些修饰键(Modifiers)包括Shift.Ctrl.Alt键,并且使用位逻辑来检查它

键盘组合键的简单应用

鼠标发生故障的两个救急键 Win键就是键盘上显示windows标志的按键,位于Ctrl业与Al键之间,一般左右各有一个Win键可单独使用,作用是启动开始菜单,但常常是配合其他键使用. 常见的应用如:Win+D显示桌面; Win+M最小化所有窗口;Win+F搜索文件或文件夹;Win+R打开"运行"对话框;Win+U打开"工具管理器". APlication键,也叫属性键一般位于键盘右Ctrl键旁,它的作用与鼠标右键功能类似.在桌面上先选中一个对 象,再按属性键,你就会

键盘Win键在哪里?

  对于一些电脑高手或者老手来说,在操作电脑的时候最常用的就是各种组合快捷键,其中在Win8系统中,最常用的组合快捷键中,经常会看到有Win键或者Windows键的身影,比如使用Win+R组合键可以打开运行对话框.Win+D可以快速返回桌面等. 其实大家看到的Win键就是Windows键的简写,直白的说,Win键就是Windows键,只要有的人喜欢简写,有的人喜欢全写而已. Win键就是键盘上显示WINDOWS标志的按键,本身并没有多大实际用处,属于辅助按键.Win键最大的作用在于与其它按键组合