1. 程式人生 > >leetcode64. 最小路徑和---動態規劃

leetcode64. 最小路徑和---動態規劃

給定一個包含非負整數的 m x n 網格,請找出一條從左上角到右下角的路徑,使得路徑上的數字總和為最小。

說明:每次只能向下或者向右移動一步。

示例:

輸入:
[
  [1,3,1],
  [1,5,1],
  [4,2,1]
]
輸出: 7
解釋: 因為路徑 1→3→1→1→1 的總和最小。

思路:

狀態方程為:

S[i][j]=A[i][j] + min(S[i-1][j], if i>0 ; S[i][j-1], if j>0)

注意不要讓矩陣的係數為負,還有二維的vector的初始化

class Solution {
public:
int minPathSum(vector<vector<int>>& grid) {
	int n=grid.size();//hang line
	int m=grid[0].size();//lie row
	int **dp=new int * [n];
	for(int i=0;i<n;i++)
		dp[i]=new int[m];
	for(int i=0;i<n;i++)
		memset(dp[i],0,sizeof(int)*m);
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<m;j++)
		{
			if(i==0)
			{
				if (j!=0)
					dp[i][j]=dp[0][j-1]+grid[0][j];
				else
					dp[i][j]=grid[0][0];
			}
			else if(j==0)
				dp[i][j]=dp[i-1][0]+grid[i][0];
			else {
				dp[i][j]=min(dp[i-1][j],dp[i][j-1])+grid[i][j];
			}               
		}
	}
	return dp[n-1][m-1];
}
};

除錯程式碼:

可以輸出路徑:

#include <iostream>
#include <vector>
using namespace std;

int** minPathSum(vector<vector<int>>& grid) {
	int n=grid.size();//hang line
	int m=grid[0].size();//lie row
	int **dp=new int * [n];
	for(int i=0;i<n;i++)
		dp[i]=new int[m];
	for(int i=0;i<n;i++)
		memset(dp[i],0,sizeof(int)*m);
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<m;j++)
		{
			if(i==0)
			{
				if (j!=0)
					dp[i][j]=dp[0][j-1]+grid[0][j];
				else
					dp[i][j]=grid[0][0];
			}
			else if(j==0)
				dp[i][j]=dp[i-1][0]+grid[i][0];
			else {
				dp[i][j]=min(dp[i-1][j],dp[i][j-1])+grid[i][j];
			}               
		}
	}
	return dp;
}

int main()
{
	vector<vector<int>> grid(3);
	for(int i=0;i<grid.size();i++)
		grid[i].resize(3);
	grid[0][0]=1;	grid[0][1]=3;	grid[0][2]=1;
	grid[1][0]=1;	grid[1][1]=5;	grid[1][2]=1;
	grid[2][0]=4;	grid[2][1]=2;	grid[2][2]=1;
	int** dp=minPathSum(grid);
	for(int i=0;i<grid.size();i++){
		for(int j=0;j<grid[0].size();j++)
			cout<<dp[i][j]<<" ";
		cout<<endl;
	}
	return 0;
}

相關推薦

leetcode64. 路徑---動態規劃

給定一個包含非負整數的 m x n 網格,請找出一條從左上角到右下角的路徑,使得路徑上的數字總和為最小。 說明:每次只能向下或者向右移動一步。 示例: 輸入: [   [1,3,1], [

數字三角形路徑動態規劃

div 路徑和 image 動態 節點 spa 直接 .cn 一行 思路:自底向上求解,從倒數第二行開始,本行節點到最後一行的最小路徑和等於該節點的數據加上下面左右兩個數據中最小的一個。不使用額外空間,直接將最小路徑和存儲到原有的數組中。1 int minimumTota

[Swift]LeetCode64. 路徑 | 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

算法52-----矩陣路徑動態規劃

sum data 列表 路徑 二次 解釋 示例 一行 lse 一、題目:矩陣最小路徑 給定一個包含非負整數的 m x n 網格,請找出一條從左上角到右下角的路徑,使得路徑上的數字總和為最小。 說明:每次只能向下或者向右移動一步。 示例: 輸入: [ [1,3,1],

leetcode64-路徑

題目描述: 給定一個包含非負整數的 m x n 網格,請找出一條從左上角到右下角的路徑,使得路徑上的數字總和為最小。 說明:每次只能向下或者向右移動一步。 示例: 輸入: [ [1,3,1], [1,5,1], [4,2,1] ] 輸出: 7 解釋: 因為路徑 1→3→1→1→1

LeetCode—Minimum Path Sum 二維陣列路徑動態規劃

感覺這是一系列的動態規劃的演算法,正好也將動態規劃的演算法進行一個總結: 演算法一: 帶權重的最小路徑的問題 Given a m x n grid filled with non-negative numbers, find a path from top left to

#動態規劃 LeetCode 64 路徑

bsp length 位置 根據 說明 font span 輸入 思考 給定一個包含非負整數的 m x n 網格,請找出一條從左上角到右下角的路徑,使得路徑上的數字總和為最小。 說明:每次只能向下或者向右移動一步。 示例: 輸入: [ [1,3,1], [1,5,1

Leetcode 931. Minimum falling path sum 下降路徑(動態規劃)

Leetcode 931. Minimum falling path sum 最小下降路徑和(動態規劃) 題目描述 已知一個正方形二維陣列A,我們想找到一條最小下降路徑的和 所謂下降路徑是指,從一行到下一行,只能選擇間距不超過1的列(也就是說第一行的第一列,只能選擇第二行的第一列和第二列;第二行的第二列

29.動態規劃-三角形路徑-Leetcode 120(python)

問題描述及示例 給定一個三角形,找出自頂向下的最小路徑和。每一步只能移動到下一行中相鄰的結點上。 例如,給定三角形: [ [2], [3,4], [6,5,7], [4,1,8,3] ] 自頂向下的最小路徑和為 11(即,2 

LeetCode-120.三角形路徑(相關話題:動態規劃

給定一個三角形,找出自頂向下的最小路徑和。每一步只能移動到下一行中相鄰的結點上。 例如,給定三角形: [ [2], [3,4], [6,5,7], [4,1,8,3] ] 自頂向下的最小路徑和為 11(即,2 + 3 + 5 + 1 = 11)。 說明:

動態規劃-路徑

給定一個包含非負整數的 m x n 網格,請找出一條從左上角到右下角的路徑,使得路徑上的數字總和為最小。 說明:每次只能向下或者向右移動一步。 示例: 輸入: [ [1,3,1], [1,5,1], [4,2,1] ] 輸出: 7 解釋:

【經典動態規劃問題】矩陣路徑問題

題目內容: 有一個矩陣map,它每個格子有一個權值。從左上角的格子開始每次只能向右或者向下走,最後到達右下角的位置,路徑上所有的數字累加起來就是路徑和,返回所有的路徑中最小的路徑和。 給定一個矩陣map及它的行數n和列數m,請返回最小路徑和。保證行列數均小於等於100. 測試樣例:

動態規劃-矩陣路徑

題目描述 有一個矩陣map,它每個格子有一個權值。 從左上角的格子開始每次只能向右或者向下走,最後到達右下角的位置,路徑上所有的數字累加起來就是路徑和。 返回所有的路徑中最小的路徑和。 給定一個矩陣map及它的行數n和列數m,請返回最小路徑和。 求解過程 給定一個N*M的矩

動態規劃3:矩陣路徑問題

題目:有一個矩陣map,它每個格子有一個權值。從左上角的格子開始每次只能向右或者向下走,最後到達右下角的位置,路徑上所有的數字累加起來就是路徑和,返回所有的路徑中最小的路徑和。 給定一個矩陣map及它的行數n和列數m,請返回最小路徑和。保證行列數均小於等於100. 測試樣例

動態規劃--矩陣路徑

int min(int a, int b) { if (a < b) return a; else return b; } int getMin(vector<vector<int> > map, int

動態規劃 路徑

給定一個只含非負整數的m*n網格,找到一條從左上角到右下角的可以使數字和最小的路徑。只能向下走或者向右走class Solution:    """    @param grid: a list of lists of integers    @return: An inte

動態規劃 LeetCode 120.三角形的路徑

題目描述 給定一個三角形,找出自頂向下的最小路徑和。每一步只能移動到下一行中相鄰的結點上。 例如,給定三角形 [ [2], [3,4], [6,5,7], [4,1

leadcode的Hot100系列--64. 路徑--權值動態規劃

如果這個: leadcode的Hot100系列--62. 不同路徑--簡單的動態規劃 看懂的話,那這題基本上是一樣的, 不同點在於: 1、這裡每條路徑相當於多了一個權值 2、結論不再固定,而是要比較不同走法哪個權值更小 針對第一點,需要把第一行和第一列的權值做一個累加: 假設這裡的權值都是1,則 A B

LeetCode64題:路徑

思路:  題目要求的是從左上角即[0,0]位置開始,到右下角即[m-1,n-1]位置為止的最小路徑和。倒過來思考的話,對於右下角[m-1,n-1]來說,它的上一步只有兩個位置即[m-2,n-1]和[m-1,n-2],因此問題就可以轉化為求從[0,0]到這兩個位置的路徑和的較小

leetcode64-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 al