最小路径(动态规划)

  • 1.最小路径和(矩形)

给定一个只含非负整数的m*n网格,找到一条从左上角到右下角的可以使数字和最小的路径。

注:你在同一时间只能向下或者向右移动一步

样例1:
1 3 1

1 5 1

4 2 1

输出:7

样例2:

1 3 5 9 
8 1 3 4 
5 0 6 1 
8 8 4 0

输出:12

import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc = new Scanner(System.in);
		int m = sc.nextInt();
		int n = sc.nextInt();
		int temp[][] = new int[m][n];
		for(int i = 0; i < m; i++){
			for(int j = 0; j < n; j++){
				temp[i][j] = sc.nextInt();
			}
		}
		System.out.print(minpath(temp));
	}

	public static int minpath(int a[][]) {

		if(a == null){
			return -1;
		}
		int m = a.length;
		int n = a[0].length;
		int dp[][] = new int[m][n];
		dp[0][0] = a[0][0];
		for(int i = 1; i < m; i++){
			dp[i][0] = dp[i - 1][0] + a[i][0];
		}
		for(int j = 1; j < n; j++){
			dp[0][j] = dp[0][j - 1] + a[0][j];
		}
		for(int i = 1; i < m; i++){
			for(int j = 1; j < n; j++){
				dp[i][j] = Math.min(dp[i - 1][j] + a[i][j], dp[i][j - 1] + a[i][j]);
			}
		}
		return dp[m - 1][n - 1];
	}
}
  • 2.不同路径个数

给定一个m*n网格,统计从左上角到右下角的所有路径个数。

注:你在同一时间只能向下或者向右移动一步

样例1:

输入: m = 3, n = 2
输出: 3

import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc = new Scanner(System.in);
		int m = sc.nextInt();
		int n = sc.nextInt();
		int temp[][] = new int[m][n];
		System.out.print(countpath(temp));
	}

	public static int countpath(int a[][]) {

		int m = a.length;
		int n = a[0].length;
		int dp[][] = new int[m][n];
		for(int i = 0; i < m; i++){
			dp[i][0] = 1;
		}
		for(int j = 0; j < n; j++){
			dp[0][j] = 1;
		}
		for(int i = 1; i < m; i++){
			for(int j = 1; j < n; j++){
				dp[i][j] = dp[i][j - 1] + dp[i - 1][j];
			}
		}
		return dp[m - 1][n - 1];
	}
}

 给定一个m*n网格,统计从左上角到右下角的所有路径个数(考虑图中有障碍物)。

注:障碍物和无障碍物可以分别用 1 和 0 来表示。

原文地址:https://www.cnblogs.com/smilexuezi/p/11550129.html

时间: 2024-10-04 20:31:02

最小路径(动态规划)的相关文章

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 minimizes the sum of all numbers along its path. 首先每一个路径的上一个路径都是来自于其上方和左方 现将最上面的路径进行求和,最左边的路径进行求和

矩阵的最小路径和二维动态规划的空间压缩

题目:给定一个矩阵,从左上角开始每次只能向右或者向下移动,最后到达右下角的位置,路径上的所有的数字累加起来作为这条路径的路劲和.要求返回所有路径和中的最小路径和. 举例: 路径1,3,1,0,6,1,0是所有路径中路径和最小的,所以返回其和12. 解析: 这个题目很类似之前的那个动态规划的数字三角的问题.毫无疑问的,这个问题也是用动态规划解决.只要确定了状态和转移方程,这个题目很容易解决.下面直接给出代码: //利用path记录路径,对于每一个path[i][j],0代表dp[i][j]的值从上

#动态规划 LeetCode 120 三角形最小路径和

给定一个三角形,找出自顶向下的最小路径和.每一步只能移动到下一行中相邻的结点上. 例如,给定三角形: [ [2], [3,4], [6,5,7], [4,1,8,3] ] 自顶向下的最小路径和为 11(即,2 + 3 + 5 + 1 = 11). 说明: 如果你可以只使用 O(n) 的额外空间(n 为三角形的总行数)来解决这个问题,那么你的算法会很加分. 思路: 接着上一题的状态转移继续说 动态规划问题,重中之重就是找到状态转移方程,而状态转移方程很重要的一点就是明确函数的意义所在,以及记录结果

左神算法第八节课:介绍递归和动态规划(汉诺塔问题;打印字符串的全部子序列含空;打印字符串的全排列,无重复排列;母牛数量;递归栈;数组的最小路径和;数组累加和问题,一定条件下最大值问题(01背包))

暴力递归: 1,把问题转化为规模缩小了的同类问题的子问题 2,有明确的不需要继续进行递归的条件(base case) 3,有当得到了子问题的结果之后的决策过程 4,不记录每一个子问题的解 动态规划 1,从暴力递归中来 2,将每一个子问题的解记录下来,避免重复计算 3,把暴力递归的过程,抽象成了状态表达 4,并且存在化简状态表达,使其更加简洁的可能 一:递归 1. 汉诺塔问题 汉诺塔问题(不能大压小,只能小压大),打印n层汉诺塔从最左边移动到最右边的全部过程. 左中右另称为 from.to.hel

【数据结构与算法】动态规划——最小路径和(普通矩阵、三角形两题)

最小路径和 LeetCode:最小路径和 题目描述: 给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小. 说明:每次只能向下或者向右移动一步. 示例: 输入: [ [1,3,1], [1,5,1], [4,2,1] ] 输出: 7 解释: 因为路径 1→3→1→1→1 的总和最小. 思想: 动态规划,可以用原数组作为dp数组 代码: class Solution { public int minPathSum(int[][] grid) {

数字三角形最小路径和—动态规划

思路:自底向上求解,从倒数第二行开始,本行节点到最后一行的最小路径和等于该节点的数据加上下面左右两个数据中最小的一个.不使用额外空间,直接将最小路径和存储到原有的数组中.1 int minimumTotal(vector<vector<int>> &triangle) { 2 // write your code here 3 for (int i = triangle.size() - 2; i >= 0; i--) { 4 for (int j = 0; j &l

算法学习——动态规划之点数值三角形的最小路径

算法描述 在一个n行的点数值三角形中,寻找从顶点开始每一步可沿着左斜或者右斜向下直到到达底端,使得每个点上的数值之和为最小 右图为一个4行的点数值三角形 算法思路 接收用户输入行数n 使用一个二维数组a[n+1][n+1]来存放各个点上的数值,数值可以由用户输入或者是随机生成 定义一个二维数组(用来存放方向)direction[n+1][n+1],存放1或0,1代表右,0代表左 定义一个二维数组b[n+1][n+1] 表示到底端的数值之和 以上图4行的点数值三角形为例 b[4][1]=47 b[

算法52-----矩阵最小路径【动态规划】

一.题目:矩阵最小路径 给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小. 说明:每次只能向下或者向右移动一步. 示例: 输入: [   [1,3,1], [1,5,1], [4,2,1] ] 输出: 7 解释: 因为路径 1→3→1→1→1 的总和最小. 思路1:时间O(M*N),空间O(M*N) 新建一个矩阵dp(大小也是M*N),该矩阵是从上往下,从左往右记录每一步的结果的,当前的结果可以根据该矩阵上面和左边最小的值来获得,即: dp[

【动态规划专题】2:矩阵的最小路径和

<程序员代码面试指南--IT名企算法与数据结构题目最优解> 左程云 著 矩阵的最小路径和 [题目]给定一个矩阵m,从左上角开始每次只能向右或者向下走,最后到达右下角位置,路径上所有的数字累加起来就是路径和,返回所有路径中最小的路径和. [举例]如果给定的m如下:1 3 5 98 1 3 45 0 6 18 8 4 0路径1,3,1,0,6,1,0是所有路径中路径和最小的,所以返回12. 关键思路:假设有一个M*N的数组 dp[M][N], dp[i][j]的值表示从左上角(0,0)位置走到(i