LeetCode6 dp
120. Triangle
我的解法用了一个二维数组,这样比较浪费空间。O(n*n)
但是标准答案自底向上,一是不需要进行特别判断,二是可以覆盖数组,则只需要O(n)的空间大小。
class Solution {
public int minimumTotal(List<List<Integer>> triangle) {
int size = triangle.size();
if(size == 1) return triangle.get(0).get(0);
int[][] dp = new int[size][size];
dp[0][0] = triangle.get(0).get(0);
int min = Integer.MAX_VALUE;
for(int i = 1; i < size; i++){
for(int j = 0; j <= i; j++){
dp[i][j] = triangle.get(i).get(j);
if(j == 0){
dp[i][j] += dp[i - 1][j];
}else if(j == i){
dp[i][j] += dp[i - 1][j - 1];
}else dp[i][j] += Math.min(dp[i - 1][j - 1], dp[i - 1][j]);
if(i == size - 1) min = Math.min(min, dp[i][j]);
}
}
return min;
}
}
他山之石:
class Solution {
public int minimumTotal(List<List<Integer>> triangle) {
int size = triangle.size();
int[] dp = new int[size + 1];
for(int i = size - 1; i >= 0; i--){
for(int j = 0; j < triangle.get(i).size(); j++){
dp[j] = Math.min(dp[j], dp[j+1]) + triangle.get(i).get(j);
}
}
return dp[0];
}
}
64. Minimun Path Sum
和上一题思路基本一致,采用了上一题的思路,只用了一个1d array。
class Solution {
public int minPathSum(int[][] grid) {
if(grid.length == 0) return 0;
int m = grid.length;
int n = grid[0].length;
int[] dp = new int[n];
for(int i = 0; i < m; i ++){
for(int j = 0; j < n; j++){
if(i == 0 && j == 0){
dp[j] = grid[0][0];
}else if(i == 0){
dp[j] = grid[i][j] + dp[j - 1];
}else if(j == 0){
dp[j] = grid[i][j] + dp[j];
}else dp[j] = Math.min(dp[j - 1], dp[j]) + grid[i][j];
}
}
return dp[n-1];
}
}
62 Unique Path
还是一样的思路, 可以稍微简化一下,有一些值例如 j = 0的情况可以不需要便利。
class Solution {
public int uniquePaths(int m, int n) {
if( m <= 0 || n <= 0) return 0;
int[] ans = new int[n];
ans[0] = 1;
for(int i = 0; i < m; i++){
for(int j = 1; j < n; j++){
if(i == 0){
ans[j] = ans[j - 1];
}else ans[j] = ans[j] + ans[j - 1];
}
}
return ans[n - 1];
}
}
91 Decode Ways
class Solution {
public int numDecodings(String s) {
int len = s.length();
if(len == 0) return 0;
int[] dp = new int[len + 1];
dp[0] = 1;
dp[1] = s.charAt(0) == '0' ? 0 : 1;
for(int i = 2; i <= len; i++){
int first = Integer.parseInt(s.substring(i - 1, i));
int second = Integer.parseInt(s.substring(i - 2, i));
if(first > 0){
dp[i] += dp[i - 1];
}
if(second >= 10 && second <= 26){
dp[i] += dp[i - 2];
}
}
return dp[len];
}
}
这道题不难,但是有很多cornercase 需要处:
两位数不能大于26 不能小于10 否则无法构成两位数
一位数必须大于0
所以最好的方法还是分别取出两位数和个位数看是否符合条件,如果符合条件就加上。
LeetCode6 dp的更多相关文章
- BZOJ 1911: [Apio2010]特别行动队 [斜率优化DP]
1911: [Apio2010]特别行动队 Time Limit: 4 Sec Memory Limit: 64 MBSubmit: 4142 Solved: 1964[Submit][Statu ...
- 2013 Asia Changsha Regional Contest---Josephina and RPG(DP)
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=4800 Problem Description A role-playing game (RPG and ...
- AEAI DP V3.7.0 发布,开源综合应用开发平台
1 升级说明 AEAI DP 3.7版本是AEAI DP一个里程碑版本,基于JDK1.7开发,在本版本中新增支持Rest服务开发机制(默认支持WebService服务开发机制),且支持WS服务.RS ...
- AEAI DP V3.6.0 升级说明,开源综合应用开发平台
AEAI DP综合应用开发平台是一款扩展开发工具,专门用于开发MIS类的Java Web应用,本次发版的AEAI DP_v3.6.0版本为AEAI DP _v3.5.0版本的升级版本,该产品现已开源并 ...
- BZOJ 1597: [Usaco2008 Mar]土地购买 [斜率优化DP]
1597: [Usaco2008 Mar]土地购买 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 4026 Solved: 1473[Submit] ...
- [斜率优化DP]【学习笔记】【更新中】
参考资料: 1.元旦集训的课件已经很好了 http://files.cnblogs.com/files/candy99/dp.pdf 2.http://www.cnblogs.com/MashiroS ...
- BZOJ 1010: [HNOI2008]玩具装箱toy [DP 斜率优化]
1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 9812 Solved: 3978[Submit][St ...
- px、dp和sp,这些单位有什么区别?
DP 这个是最常用但也最难理解的尺寸单位.它与“像素密度”密切相关,所以 首先我们解释一下什么是像素密度.假设有一部手机,屏幕的物理尺寸为1.5英寸x2英寸,屏幕分辨率为240x320,则我们可以计算 ...
- android px转换为dip/dp
/** * 根据手机的分辨率从 dp 的单位 转成为 px(像素) */ public int dipTopx(Context context, float dpValue) { final floa ...
随机推荐
- ubuntu开发c/c++帮助文档
1.C语言库函数基本的帮助文档 sudo apt-get install manpages sudo apt-get install manpages-de sudo apt-get install ...
- 04.Linux-CentOS系统SSH连接问题
问题:SSH远程连接时报错 Socket error Event: 32 Error: 10053.Connection closing...Socket close.Connection close ...
- CentOS7 SSH 密码正确,但仍提示“Permission denied”
我看其他人解决办法,有的是防火墙端口,有的是sshd_config文件的密码登录,有的ip冲突等等,我都按照那些修改了,但是都不通,最后修改了这个,好用了. 看一下SElinux,敲sestatus, ...
- Switch能否用String类型做参数?
switch(expr): 其中,expr参数可以是一个枚举常量(由整型或字符类型实现)或一个整数表达式,其中整数表达式可以是基本类型int或其包装类Integer.由于byte.short和char ...
- pyc文件是什么
pyc 是一种二进制文件,是由 py 文件经过编译后,生成的文件,是一种 bytecode,py 文件变成 pyc 文件后,加载的速度有所提高,而且 pyc 是一种跨平台的字节码,是由 Python ...
- 命令行启动appium服务
Android终端 appium --avd test -a 127.0.0.1 -p 4723 --language "zh_CN" --locale "CN" ...
- c++ ofstream使用方法
ofstream是从内存到硬盘,ifstream是从硬盘到内存,流缓冲即是内存空间. 插入器<< : 向流输出数据. cout << "test!" &l ...
- 每天一个linux命令:tail(16)
tail tail命令用于输入文件中的尾部内容,不指定文件时,作为输入信息进行处理.tail命令默认在屏幕上显示指定文件的末尾10行.命令从指定点开始将文件写到标准输出,使用tail命令的-f选项可以 ...
- HDU 6069 Counting Divisors —— 2017 Multi-University Training 4
Counting Divisors Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 524288/524288 K (Java/Oth ...
- tracert命令 -网络管理命令
Tracert是路由跟踪程序,用于确定 IP 数据报访问目标所经过的路径.Tracert 命令用 IP 生存时间 (TTL) 字段和 ICMP 错误消息来确定从一个主机到网络上其他主机的路由. 在工作 ...