[DP]矩阵的最小路径和
题目
给定一个矩阵m, 从左上角开始每次只能向右或者向下走,最后到达右下角的位置,路径上所有的树子累加起来就是路径和,返回所有的路径中最小的路径和.
解法一
这是一道经典的动态规划题,状态转移方程为dp[i][j] = min{dp[i - 1][j], dp[i][j - 1]} + m[i][j].可以用一个二维的dp矩阵来求解.对于dp矩阵,第一行和第一列只会有一种走法,就是从左到右或者从上到下的累加,所以可以先进行初始化,然后其他元素就可以用过转移方程一个一个填充,知道把整个dp矩阵填充完毕.
解法二
如果用二维数组,对于m行n列的数组,空间复杂度就是O(m*n).动态规划中常用的优化方法之一就是仅使用一个一维数组在进行这个迭代过程.但是这种空间压缩也有局限性,那就是不能记录获得最后结果的路径.如果需要完整路径的话还是需要二维的动态规划表.
代码
#include <iostream>
#include <vector> using namespace std;
//使用二维数组的方式
int minPathSum1(int arr[][], int m, int n) {
if (m == || n == )
return ;
int dp[m][n];
dp[][] = arr[][];
for (int i = ; i < m; i ++)
dp[i][] = dp[i - ][] + arr[i][];
for (int j = ; j < n; j ++)
dp[][j] = dp[][j - ] + arr[][j]; for (int i = ; i < m; i ++) {
for (int j = ; j < n; j ++)
dp[i][j] = min(dp[i - ][j], dp[i][j - ]) + arr[i][j];
} // print array
// for (int i = 0; i < 4; i ++) {
// for (int j = 0; j < 4; j ++)
// cout<<dp[i][j]<<" ";
// cout<<endl;
// } return dp[m - ][n - ];
} //使用一维数组的方式
int minPathSum2(int arr[][], int m, int n) {
if (m == || n == )
return ;
int dp[n];
dp[] = arr[][];
for (int k = ; k < n; k ++)
dp[k] = dp[k - ] + arr[][k]; for (int i = ; i < m; i ++) {
for (int j = ; j < n; j ++) {
if (j == )
dp[j] = dp[j] + arr[i][];
else {
dp[j] = min(dp[j - ], dp[j]) + arr[i][j];
}
}
} //print dp array
// for (int k = 0; k < n; k ++)
// cout<<dp[k]<<" ";
// cout<<endl; return dp[n - ];
} int main()
{
int arr[][] = {{,,,},{,,,},{,,,},{,,,}}; for (int i = ; i < ; i ++) {
for (int j = ; j < ; j ++)
cout<<arr[i][j]<<" ";
cout<<endl;
} cout<<minPathSum2(arr, , )<<endl;
return ;
}
[DP]矩阵的最小路径和的更多相关文章
- OptimalSolution(1)--递归和动态规划(2)矩阵的最小路径和与换钱的最少货币数问题
一.矩阵的最小路径和 1 3 5 9 1 4 9 18 1 4 9 18 8 1 3 4 9 9 5 8 12 5 0 6 1 14 14 5 11 12 8 8 4 0 22 22 13 15 12 ...
- 1. 线性DP 120. 三角形最小路径和
经典问题: 120. 三角形最小路径和 https://leetcode-cn.com/problems/triangle/ func minimumTotal(triangle [][]int) ...
- Light OJ 1406 Assassin`s Creed 减少国家DP+支撑点甚至通缩+最小路径覆盖
标题来源:problem=1406">Light OJ 1406 Assassin`s Creed 意甲冠军:向图 派出最少的人经过全部的城市 而且每一个人不能走别人走过的地方 思路: ...
- Light OJ 1406 Assassin`s Creed 状态压缩DP+强连通缩点+最小路径覆盖
题目来源:Light OJ 1406 Assassin`s Creed 题意:有向图 派出最少的人经过全部的城市 而且每一个人不能走别人走过的地方 思路:最少的的人能够走全然图 明显是最小路径覆盖问题 ...
- leetcode-64. 最小路径和 · vector + DP
题面 Given a m x n grid filled with non-negative numbers, find a path from top left to bottom right wh ...
- Leetcode之动态规划(DP)专题-64. 最小路径和(Minimum Path Sum)
Leetcode之动态规划(DP)专题-64. 最小路径和(Minimum Path Sum) 给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小. ...
- leetcode 64. 最小路径和 动态规划系列
目录 1. leetcode 64. 最小路径和 1.1. 暴力 1.2. 二维动态规划 2. 完整代码及执行结果 2.1. 执行结果 1. leetcode 64. 最小路径和 给定一个包含非负整数 ...
- 【LeetCode】最小路径和
[问题]给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小. 说明:每次只能向下或者向右移动一步. 示例: 输入: [ [,,], [,,], [, ...
- [LeetCode] Minimum Path Sum 最小路径和
Given a m x n grid filled with non-negative numbers, find a path from top left to bottom right which ...
随机推荐
- 转载 | SVG向下兼容优雅降级方法
本文引自:http://www.zhangxinxu.com/wordpress/2013/09/svg-fallbacks/ 1.svg image标签降级技术 <svg width=&quo ...
- alluxio源码解析-层次化存储(4)
层次化存储-特性介绍: https://www.alluxio.org/docs/1.6/cn/Tiered-Storage-on-Alluxio.html 引入分层存储后,Alluxio管理的数据块 ...
- Mysql 分页order by一个相同字段,发现顺序错乱
两次分页查询,其中跳过了2个id select * from jdp_tb_trade where jdp_modified>='2017-04-24 20:22:01' and jdp_ ...
- C语言tips_1 关于&& || ! 的优先级
关于&& || ! 三种操作的优先级 测试如下 简要分析 假设&&>|| 则结果为1 假设||>&& 则结果为0 结果为1 得证 & ...
- ArcGIS数据格式详解
- (十九)c#Winform自定义控件-停靠窗体
前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. 开源地址:https://gitee.com/kwwwvagaa/net_winform_custom_control ...
- 简述关于ASP.NET MVC与.NET CORE 的区别
简述关于ASP.NET MVC与.NET CORE的区别1.关于ASP.NET 关于MVC刚开始接触这个技术的时候我经常不理解他们的名字,我相信许多学ASP.NET开发人员开始接触MVC应该也和我一样 ...
- Homebrew 安装 Docker Desktop for Mac
无意中发现Homebrew现在已经支持Docker Desktop for Mac了,因此特意把原来通过 https://docs.docker.com/docker-for-mac/install/ ...
- MySQL数据库的安装和配置
MySQL数据库介绍 什么是数据库DB? DB的全称是database,即数据库的意思.数据库实际上就是一个文件集合,是一个存储数据的仓库,数据库是按照特定的格式把数据存储起来,用户可以对存储的数据进 ...
- 在Keras中使用VGG进行物体识别(直接使用)
https://blog.csdn.net/baimafujinji/article/details/80700263