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));
    }
}


posted @ 2022-01-20 15:20  小傻孩丶儿  阅读(26)  评论(0编辑  收藏  举报