题目

https://leetcode.com/problems/2-keys-keyboard/description/

题解

再一次印证了我在 总结 DP 模型套路 中说的:从递归->DP之后,新的代码已经脱离原有含义了,且整个优化过程可以不看题意、仅从代码逻辑上进行改写。对于改成DP之后的代码,它是否与题意还有联系已经不重要了。能强行解释吗?可以,但是自顶向下和自底向上本来就是两个完全相反的理解方式,强行解释之后早已不是我的本意了。

喷一下官方题解:上来就贴所谓的“状态转移方程”,这玩意儿谁能看懂?明显是拿结论去推原因,给结论重新编一个看似有道理的解释,实际上已经与最原始的思维过程相差甚远了。

详见 Solution 1~4。

4次提交,一次更比一次慢,这是我没想到的。。

分析 dp 表的依赖关系草稿:

class Solution {public int minSteps(int n) {if (n == 1) return 0;// Solution 0: 不可转化成DP的暴力递归(AC)
//        process0(n, 2, 1, 2);
//        return result;// Solution 1: 可转化为DP的暴力递归(AC)
//        return 2 + process1(n, 2, 1);// Solution 2: 暴力递归+傻缓存(AC)
//        int[][] dp = new int[n + 1][n + 1]; // cur, copied
//        for (int i = 0; i < n; i++) {//            for (int j = 0; j <= n; j++) {//                dp[i][j] = -1;
//            }
//        }
//        return 2 + process2(n, 2, 1, dp);// Solution 3: DP(AC)int[][] dp = new int[n + 1][n + 1]; // cur, copiedfor (int i = 0; i < n; i++) {for (int j = 0; j <= n; j++) {dp[i][j] = -1;}}for (int copied = n; copied >= 0; copied--) {for (int cur = n - 1; cur >= 0; cur--) {// copy allint p1 = Integer.MAX_VALUE;if (copied != cur) p1 = dp[cur][cur];if (p1 != Integer.MAX_VALUE) p1++;// pasteint p2 = Integer.MAX_VALUE;if (cur + copied <= n) p2 = dp[cur + copied][copied];if (p2 != Integer.MAX_VALUE) p2++;dp[cur][copied] = Math.min(p1, p2);}}return 2 + dp[2][1];}//    public int process2(int n, int cur, int copied, int[][] dp) {//        if (cur > n) return Integer.MAX_VALUE;
//        if (dp[cur][copied] >= 0) return dp[cur][copied];
//
//        // copy all
//        int p1 = Integer.MAX_VALUE;
//        if (copied != cur) p1 = process2(n, cur, cur, dp);
//        if (p1 != Integer.MAX_VALUE) p1++;
//        // paste
//        int p2 = process2(n, cur + copied, copied, dp);
//        if (p2 != Integer.MAX_VALUE) p2++;
//
//        dp[cur][copied] = Math.min(p1, p2);
//        return dp[cur][copied];
//    }
//
//    public int process1(int n, int cur, int copied) {//        if (cur == n) return 0;
//        if (cur > n) return Integer.MAX_VALUE;
//
//        // copy all
//        int p1 = Integer.MAX_VALUE;
//        if (copied != cur) p1 = process1(n, cur, cur);
//        if (p1 != Integer.MAX_VALUE) p1++;
//        // paste
//        int p2 = process1(n, cur + copied, copied);
//        if (p2 != Integer.MAX_VALUE) p2++;
//
//        return Math.min(p1, p2);
//    }
//
//    int result = Integer.MAX_VALUE;
//    public void process0(int n, int cur, int copied, int steps) {//        if (cur == n) {//            result = Math.min(result, steps);
//            return;
//        }
//        if (cur > n) return;
//        // copy all
//        if (copied != cur) process0(n, cur, cur, steps + 1);
//        // paste
//        process0(n, cur + copied, copied, steps + 1);
//    }
}

leetcode 650. 2 Keys Keyboard | 650. 只有两个键的键盘(暴力递归->傻缓存->DP)相关推荐

  1. leetcode 576. Out of Boundary Paths | 576. 出界的路径数(暴力递归->傻缓存->dp)

    题目 https://leetcode.com/problems/out-of-boundary-paths/ 题解 经典的 从递归到 dp,不多说,上代码. class Solution {publ ...

  2. [Leetcode] 650. 2 Keys Keyboard 解题报告

    题目: Initially on a notepad only one character 'A' is present. You can perform two operations on this ...

  3. LeetCode 650. 只有两个键的键盘(DP)

    1. 题目 最初在一个记事本上只有一个字符 'A'.你每次可以对这个记事本进行两种操作: Copy All (复制全部) : 你可以复制这个记事本中的所有字符(部分的复制是不允许的). Paste ( ...

  4. 2 Keys Keyboard 只有两个键的键盘

    最初在一个记事本上只有一个字符 'A'.你每次可以对这个记事本进行两种操作: Copy All (复制全部) : 你可以复制这个记事本中的所有字符(部分的复制是不允许的). Paste (粘贴) : ...

  5. leetcode算法题--只有两个键的键盘

    原题链接:https://leetcode-cn.com/problems/2-keys-keyboard/ 1.递归 int minSteps(int n) {if(n==1){return 0;} ...

  6. 只有两个键的键盘,只会复制粘贴

    文章目录 1.描述 2.关键字 3.思路 4.notes 5.复杂度 6.code 1.描述 最初记事本上只有一个字符 'A' .你每次可以对这个记事本进行两种操作: Copy All(复制全部):复 ...

  7. leetcode 712. Minimum ASCII Delete Sum for Two Strings | 712. 两个字符串的最小ASCII删除和(暴力递归->傻缓存->DP)

    题目 https://leetcode.com/problems/minimum-ascii-delete-sum-for-two-strings/ 题解 经典的 暴力递归 -> 傻缓存 -&g ...

  8. leetcode 174. Dungeon Game | 174. 地下城游戏(暴力递归->傻缓存->dp)

    题目 https://leetcode.com/problems/dungeon-game/ 题解 方法1:4个参数的递归+缓存,TLE 今日结论:转换成dp之前,递归的参数设计很重要,参数越少越好 ...

  9. leetcode 813. Largest Sum of Averages | 813. 最大平均值和的分组(暴力递归->傻缓存->DP)

    题目 https://leetcode.com/problems/largest-sum-of-averages/ 题解 好久不 dp 了,来一道快乐的 dp 保持手感. 经典的暴力递归 -> ...

最新文章

  1. 作为程序员,你是否曾经想过写一本书?
  2. Python知识点6——函数
  3. tinyMce在线编辑器内JavaScript实现按Ctrl+S无刷新保存
  4. Unix shell 编程相关命令
  5. pat天梯赛练习 L2-006
  6. ad中电容用什么封装_用什么来降低噪声?只要几个电容器就可以,简单有效!...
  7. 服务器交换机项目购买,四川大学网络空间安全研究院服务器、交换机等采购项目...
  8. 程序员35岁之后的出路_35岁的程序员走向何方?
  9. 基础知识—数据类型-第一个C++程序
  10. APUE 学习笔记(三) 文件和目录
  11. paper reading:[renormalization]Semi-supervised Classification with Graph Convolutional Networks
  12. 淘宝昨现重大线上bug,S1级事故,疑似程序员故意埋雷
  13. httpclient之get/post
  14. MySQL 之 query cache
  15. 微信支付计算机,微信电脑版怎么支付?怎么开通微信支付?
  16. 经纬度坐标二维数组检验正则表达式
  17. 石头剪刀布程序流程图_民间传统体育游戏 | 石头剪刀布
  18. 常见排序算法原理及java实现
  19. Python 多进程与数据库连接池配合同时取出数据进行处理
  20. Cassandra,NoSQL中的兰博基尼

热门文章

  1. CodeForces - 1419E Decryption(质因子分解+构造)
  2. HDU - 5187 zhx's contest(快速幂+快速加+组合数学)
  3. Pollard_rho算法+Miller_Rabin算法(大素数的判断与素因子分解)(模板)
  4. python 控制qq_最必要的最小建议集:写给刚入门编程(python)的同学
  5. C++ COM编程之QueryInterface函数(二)
  6. chromium net android移植
  7. 抖音访问太频繁-设备注册分析
  8. Socket之TCP服务器【Python】
  9. tomcat 启动异常 The web application [ROOT] registered the JDBC driver [xxx] but failed to unregister it
  10. 微服务架构的终极模式?