leetcode 650. 2 Keys Keyboard | 650. 只有两个键的键盘(暴力递归->傻缓存->DP)
题目
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)相关推荐
- leetcode 576. Out of Boundary Paths | 576. 出界的路径数(暴力递归->傻缓存->dp)
题目 https://leetcode.com/problems/out-of-boundary-paths/ 题解 经典的 从递归到 dp,不多说,上代码. class Solution {publ ...
- [Leetcode] 650. 2 Keys Keyboard 解题报告
题目: Initially on a notepad only one character 'A' is present. You can perform two operations on this ...
- LeetCode 650. 只有两个键的键盘(DP)
1. 题目 最初在一个记事本上只有一个字符 'A'.你每次可以对这个记事本进行两种操作: Copy All (复制全部) : 你可以复制这个记事本中的所有字符(部分的复制是不允许的). Paste ( ...
- 2 Keys Keyboard 只有两个键的键盘
最初在一个记事本上只有一个字符 'A'.你每次可以对这个记事本进行两种操作: Copy All (复制全部) : 你可以复制这个记事本中的所有字符(部分的复制是不允许的). Paste (粘贴) : ...
- leetcode算法题--只有两个键的键盘
原题链接:https://leetcode-cn.com/problems/2-keys-keyboard/ 1.递归 int minSteps(int n) {if(n==1){return 0;} ...
- 只有两个键的键盘,只会复制粘贴
文章目录 1.描述 2.关键字 3.思路 4.notes 5.复杂度 6.code 1.描述 最初记事本上只有一个字符 'A' .你每次可以对这个记事本进行两种操作: Copy All(复制全部):复 ...
- leetcode 712. Minimum ASCII Delete Sum for Two Strings | 712. 两个字符串的最小ASCII删除和(暴力递归->傻缓存->DP)
题目 https://leetcode.com/problems/minimum-ascii-delete-sum-for-two-strings/ 题解 经典的 暴力递归 -> 傻缓存 -&g ...
- leetcode 174. Dungeon Game | 174. 地下城游戏(暴力递归->傻缓存->dp)
题目 https://leetcode.com/problems/dungeon-game/ 题解 方法1:4个参数的递归+缓存,TLE 今日结论:转换成dp之前,递归的参数设计很重要,参数越少越好 ...
- leetcode 813. Largest Sum of Averages | 813. 最大平均值和的分组(暴力递归->傻缓存->DP)
题目 https://leetcode.com/problems/largest-sum-of-averages/ 题解 好久不 dp 了,来一道快乐的 dp 保持手感. 经典的暴力递归 -> ...
最新文章
- 作为程序员,你是否曾经想过写一本书?
- Python知识点6——函数
- tinyMce在线编辑器内JavaScript实现按Ctrl+S无刷新保存
- Unix shell 编程相关命令
- pat天梯赛练习 L2-006
- ad中电容用什么封装_用什么来降低噪声?只要几个电容器就可以,简单有效!...
- 服务器交换机项目购买,四川大学网络空间安全研究院服务器、交换机等采购项目...
- 程序员35岁之后的出路_35岁的程序员走向何方?
- 基础知识—数据类型-第一个C++程序
- APUE 学习笔记(三) 文件和目录
- paper reading:[renormalization]Semi-supervised Classification with Graph Convolutional Networks
- 淘宝昨现重大线上bug,S1级事故,疑似程序员故意埋雷
- httpclient之get/post
- MySQL 之 query cache
- 微信支付计算机,微信电脑版怎么支付?怎么开通微信支付?
- 经纬度坐标二维数组检验正则表达式
- 石头剪刀布程序流程图_民间传统体育游戏 | 石头剪刀布
- 常见排序算法原理及java实现
- Python 多进程与数据库连接池配合同时取出数据进行处理
- Cassandra,NoSQL中的兰博基尼
热门文章
- CodeForces - 1419E Decryption(质因子分解+构造)
- HDU - 5187 zhx's contest(快速幂+快速加+组合数学)
- Pollard_rho算法+Miller_Rabin算法(大素数的判断与素因子分解)(模板)
- python 控制qq_最必要的最小建议集:写给刚入门编程(python)的同学
- C++ COM编程之QueryInterface函数(二)
- chromium net android移植
- 抖音访问太频繁-设备注册分析
- Socket之TCP服务器【Python】
- tomcat 启动异常 The web application [ROOT] registered the JDBC driver [xxx] but failed to unregister it
- 微服务架构的终极模式?