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. SpringCloud的Bus(一)消息中间件的概念和用途

    一.概念与定义 1.Message Broker Message Broker是一种消息验证.消息转换.消息路由的架构模式,用于如: 消息路由到一个或多个目的地 消息转化为其他的表现方式 执行消息的聚 ...

  2. 大数据学习总结(4)参考splunk架构

  3. LDAP apacheds解决方案

    Apache DS 配置与管理   LADP基本介绍 LDAP(轻量级目录访问协议)以目录的形式来管理资源(域用户,用户组,地址簿,邮件用户,打印机等等).   特点: 1. LDAP是一种网略协议而 ...

  4. scrollTop doesn't scroll on Chrome 61

    在chrome61 不支持滚动 解决方案: Use document.scrollingElement if supported, and fall back to the current code. ...

  5. Delphi X10.2 + FireDAC 使用 SQL 语句 UPDATE

    MainForm.Conn.StartTransaction; UserManagerQuery.SQL.Clear; UserManagerQuery.SQL.Text := 'UPDATE tab ...

  6. iOS10 越狱, openSSH

    iOS 10 已经可以越狱, 不过比较蛋疼的是非完美越狱,每次重启都要从新越狱. 感兴趣的同学可以尝试一下,本人使用同步推上的教程,亲测可用. 越狱完后想安装OpenSSH, 在Cydia上搜索安装, ...

  7. 我常用的css基础

    mkdir 创建文件夹touch 创建文件mode:'history' ----------------------------------------------------------去除# di ...

  8. bootStrap Table 如何使用

    最近在使用bootStrap Table 的表格功能有一些自己的理解写下来分享一下主要用的是一个bootStrapTable 和 jquery 的混合开发 具体怎样引入bootStrap Table ...

  9. spark-shell报错:Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/hadoop/fs/FSDataInputStream

    环境: openSUSE42.2 hadoop2.6.0-cdh5.10.0 spark1.6.0-cdh5.10.0 按照网上的spark安装教程安装完之后,启动spark-shell,出现如下报错 ...

  10. codeforces 842C Ilya And The Tree

    Ilya is very fond of graphs, especially trees. During his last trip to the forest Ilya found a very ...