64. Minimum Path Sum(中等, 又做出一个DP题, 你们非问我开不开心,当然开心喽!^^)
Given an m x n grid filled with nonnegative numbers, find a path from top left to bottom right which minimizes the sum of all numbers along its path.
Note: You can only move either down or right at any point in time.
动态规划问题.
- 状态转移公式:
F[i,j] = min(F[i,j-1], F[i-1,j]) + A[i,j]
- 最优子结构:
F[i,j-1], F[i-1,j] 和 A[i,j]
- 边界:
F[0,0] = A[0,0];
参照例子:
1 2 3 4
4 3 2 1
2 1 2 3
实现中有三种选择:
- 最优的: \(O(m*n)\) time, \(O(min(m, n))\) extra space;(maintain an array)
- 次优的: \(O(m*n)\) time, \(O(m)+O(n)\) extra space;(维护俩数组,长度分别m, n)
- 最差的: \(O(m*n)\) time, \(O(m*n)\) extra space.(maintain a matrix, m*n)
自个想法,自个最优空间复杂度代码:
\(O(m*n)\) time, \(O(min(m, n))\) extra space;
// method 2
// DP
// F[i,j] = min(F[i,j-1], F[i-1,j] + A[i,j])
// O(m*n) time, O(min(m,n)) extra space
int minPathSum(vector<vector<int>>& A) {
const int m = A.size(), n = A[0].size();
if (m == 0) return 0;
if (m == 1 && n == 1) return A[0][0];
vector<int> dp(n);
// load the 0st row of A into dp
dp[0] = A[0][0];
for (int j = 1; j < n; j++)
dp[j] = A[0][j] + dp[j - 1];
// fill none first row and col in dp by state transfer equation
for (int i = 1; i < m; i++) {
for (int j = 0; j < n; j++) {
if (j == 0) dp[j] = dp[j] + A[i][0];
else dp[j] = min(dp[j - 1], dp[j]) + A[i][j];
}
}
return dp[n - 1];
}
自个想法,自个差空间复杂度代码:
\(O(m*n)\) time, \(O(m*n)\) extra space;
// method 1
// DP
// F[i,j] = min(F[i,j-1], F[i-1,j]) + A[i,j]
// O(m*n) time, O(m*n) extra space
// not good
int minPathSum(vector<vector<int>>& A) {
const int m = A.size(), n = A[0].size();
if (m == 0) return 0;
if (m == 1 && n == 1) return A[0][0];
// initialize dp(m*n) matrix
vector < vector<int> > dp(m);
for (int i = 0; i < m; i++)
dp[i].resize(n);
// fill first row in dp
dp[0][0] = A[0][0];
for (int j = 1; j < n; j++)
dp[0][j] = A[0][j] + dp[0][j - 1];
// fill first col in dp
for (int i = 1; i < m; i++)
dp[i][0] = A[i][0] + dp[i - 1][0];
// fill none first row and col in dp by state transfer equation
for (int i = 1; i < m; i++) {
for (int j = 1; j < n; j++) {
dp[i][j] = min(dp[i][j - 1], dp[i - 1][j]) + A[i][j];
}
}
return dp[m - 1][n - 1];
}
随机推荐
- python基础—迭代器、生成器
python基础-迭代器.生成器 1 迭代器定义 迭代的意思是重复做一些事很多次,就像在循环中做的那样. 只要该对象可以实现__iter__方法,就可以进行迭代. 迭代对象调用__iter__方法会返 ...
- Hive函数:SUM,AVG,MIN,MAX
转自:http://lxw1234.com/archives/2015/04/176.htm,Hive分析窗口函数(一) SUM,AVG,MIN,MAX 之前看到大数据田地有关于max()over(p ...
- netcore webapi帮助文档设置
如何建 .netcore webapi 项目这个就不说了,这个都没有没必要看下去. 我这里是.netcore 2.0,虽然没测过1.0的,但想来差不多. 1.Nuget Packages安装,使用程序 ...
- 【Jhipster】升级/修改 数据库结构
前提 1.jhipster环境,jdk1.8,yeoman,node.js安装环境参考官方wiki,环境问题参考我的博客,如果出现注册中心空白页,请参考博客 2.首先需要启动jhipster基础服务, ...
- if else if,switch case二者的联系与区别
前段时间在学习中听到了一个关于条件判断语句的问题,分析if else if语句和switch case语句这两者之间的联系和区别,从而使用其中最有效率的一种方法. 一.if...else if if. ...
- AutoFac+MVC+WebApi源码----我踩过的坑
发现网上关于AutoFac的Demo源码比较少,综合MVC和WepApi的更少.所以贴出源码 WebApi项目(MVC4不需要引用,历史遗留问题,人懒没删) 建项目 新建类库IAutoFacDal(接 ...
- javaIO操作之字节输入流--InputStream
/** *<li> InputStream类中定义的方法: * <li>读取的数据保存在字节数组中,返回读取的字节数组的长度:public int read(byte[] b) ...
- SpringIOC学习三
基于注解的注入:就是用注解标签的方式替换掉我们xml配置文件里面bean的注册和依赖关系的描述 a:首先回顾IOC(控制反转),进行依赖注入需要做到两件事情: 1:注册类 2:描 ...
- 计蒜客NOIP模拟赛4 D1T3 小X的佛光
小 X 是远近闻名的学佛,平日里最喜欢做的事就是蒸发学水. 小 X 所在的城市 X 城是一个含有 N 个节点的无向图,同时,由于 X 国是一个发展中国家,为了节约城市建设的经费,X 国首相在建造 X ...
- 【BZOJ3506】【Cqoi2014】排序机械臂
传送门(因为BZOJ上没有题面...所以放的是luogu的) 题意:你需要维护一个序列,支持区间翻转与查询区间最小. 解题思路:由于区间最小实际上每一次就是对应的整个数列的第k小,因此可以直接预处理解 ...