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.

动态规划问题.

  1. 状态转移公式: F[i,j] = min(F[i,j-1], F[i-1,j]) + A[i,j]
  2. 最优子结构: F[i,j-1], F[i-1,j] 和 A[i,j]
  3. 边界: F[0,0] = A[0,0];

参照例子:

1 2 3 4
4 3 2 1
2 1 2 3

实现中有三种选择:

  1. 最优的: \(O(m*n)\) time, \(O(min(m, n))\) extra space;(maintain an array)
  2. 次优的: \(O(m*n)\) time, \(O(m)+O(n)\) extra space;(维护俩数组,长度分别m, n)
  3. 最差的: \(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];
}

随机推荐

  1. Linux CentOS7.0 (01)在Vmvare Workstation上 安装配置

    一.新建虚拟机 1.创建新的虚拟机 -> 默认典型 ->选择安装介质 2.指定虚拟机名称.安装目录.磁盘容量大小 点击 "完成",创建虚拟机! 随后虚拟机将自动启动安装 ...

  2. maven入门(1-4)使用eclipse构建maven项目

    1. 安装m2eclipse插件    要用Eclipse构建Maven项目,我们需要先安装meeclipse插件    点击eclipse菜单栏Help->Eclipse Marketplac ...

  3. 基于python的统计公报关键数据爬取 update

    由于之前存在的难以辨别市本级,全市相关数据的原因,经过考虑采用 把含有关键词的字段全部提取进行人工辨别的方法 在其余部分不改变的情况下,更改test部分 def test(real_Title,rea ...

  4. 用Jmeter实现SQLServer数据库的增删查改

    1.添加线程组 Jmeter性能测试,最重要的就是线程组了,线程组相当于用户活动 2.添加JDBC Connection Configuration Database URL:jdbc:sqlserv ...

  5. python与mongodb的交互 增删改差

    首先引入包: pip install pymongo需要用到如下对象: MongoClient对象:用于与MongoDB服务器建立连接 client=MongoClient('主机ip',端口) Da ...

  6. 南京邮电大学java程序设计作业在线编程第一次作业

    王利国的"Java语言程序设计第1次作业(2018)"详细 作业结果详细 总分:100 选择题得分:40  1. Java语言中,基本数据类型一共有( )种. A.16 B.2 C ...

  7. jacascript CSS样式的脚本化操作

    前言:这是笔者学习之后自己的理解与整理.如果有错误或者疑问的地方,请大家指正,我会持续更新! 引入CSS有3种方式:行间样式,内联样式和外部链接样式. 在实际工作中,我们使用 javascript 操 ...

  8. CSS3属性之圆角效果——border-radius属性

    在css3之前,要实现圆角的效果可以通过图片或者用margin属性实现(可以参考这里:http://www.hicss.net/css-practise-of-image-round-box/).实现 ...

  9. 解决firefox不支持-webkit-line-clamp属性

    转载声明: 请注明本文引用自http://www.cnblogs.com/guolizhi/ css中-webkit-line-clamp这个属性表示超过指定行的文本隐藏并且会在结尾加上...号,用起 ...

  10. Opencv在mac系统的安装与试用

    1.在mac终端内,使用brew安装opencv3,这时我的opencv被安装到/usr/local/Cellar/opencv3/3.2.0内. 2.新建xcode 项目,选择command lin ...