leetcode-递归-四键键盘
package dp.四键键盘;
import java.util.HashMap;
import java.util.Map;
/**
* 867 · 四键键盘
* 算法
* 中等
* 通过率
* 51%
* <p>
* 题目题解笔记讨论排名
* 描述
* 假设你有一个特殊的键盘,键盘上有如下键:
* <p>
* 键1: (A): 在屏幕上打印一个'A'。
* 键2: (Ctrl-A): 选择整个屏幕。
* 键3: (Ctrl-C): 复制选择到缓冲区。
* 键4: (Ctrl-V): 在屏幕上已有的内容后面追加打印缓冲区的内容。
* 现在,你只能按键盘上N次(使用以上四个键),找出你可以在屏幕上打印的“A”的最大数量
* <p>
* 微信加 jiuzhang15 发送验证信息【867】领最新大厂高频题
* <p>
* 1 <= N <= 50
* 答案将在32位有符号整数的范围内。
* 样例
* 样例 1:
* <p>
* 输入: 3
* 输出: 3
* 解释: A, A, A
* 样例 2:
* <p>
* 输入: 7
* 输出: 9
* 解释: A, A, A, Ctrl A, Ctrl C, Ctrl V, Ctrl V
*/
public class 四键键盘 {
public static int maxA(int N) {
Map<String, Integer> map = new HashMap<>();
return dp(N, 0, 0, map);
}
//内存超了,但是方法没问题,备忘录也用了
private static int dp(int n, int aNum, int copy, Map<String, Integer> map) {
if (n <= 0) {
return aNum;
}
String key = String.valueOf(n) +" "+ String.valueOf(aNum) +" "+ String.valueOf(copy);
if (map.containsKey(key)) {
return map.get(key);
}
/**
* 三种状态
* dp(n-1,a_num,copy) a
* dp(n-1,a_num+copy,copy) cv
* dp(n-2,a_num,a_num) ca cc
*/
int maxNum = Math.max(
Math.max(dp(n - 1, aNum + 1, copy, map),
dp(n - 1, aNum + copy, copy, map)),
dp(n - 2, aNum, aNum, map)
);
map.put(key, maxNum);
return maxNum;
}
public static void main(String[] args) {
System.out.println(maxA(30));
}
}
不恋尘世浮华,不写红尘纷扰