##LeeCode 63 UniquePath2左上角到右下角路径个数
转载:https://blog.csdn.net/feliciafay/article/details/20509067
题目如下:
Follow up for “Unique Paths”:
Now consider if some obstacles are added to the grids. How many unique paths would there be?
An obstacle and empty space is marked as 1 and 0 respectively in the grid.
For example,
There is one obstacle in the middle of a 3x3 grid as illustrated below.
[
[0,0,0],
[0,1,0],
[0,0,0]
]
The total number of unique paths is 2.
Note: m and n will be at most 100.
分析如下:
采用和上一题 Unique Path类似的思路(思路一,动态规划),额外增加一个条件判断:如果obstacleGrid[i][j]==1,则说明有障碍,不能在(i,j)点累计路径条数,否则,在(i,j)点累积的路径条数为(i-1,j)和(i,j-1)的路径条数之和。
本文来自 feliciafay 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/feliciafay/article/details/20509067?utm_source=copy
#include<iostream>
#include<vector>
using namespace std;
int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
int m = obstacleGrid.size();
if (m == 0)
return 0;
int n = obstacleGrid[0].size();
if (obstacleGrid[0][0] || obstacleGrid[m - 1][n - 1])
return 0;
//int dp[m + 5][n + 5];
//memset(dp, 0, sizeof(dp));
vector<vector<int>> dp(m, vector<int>(n, 0));
dp[0][0] = 1;
for (int i = 1; i<m; i++)
{
if (!obstacleGrid[i][0])
dp[i][0] = dp[i - 1][0];
}
for (int i = 1; i < n; i++)
{
if (!obstacleGrid[0][i])
dp[0][i] = dp[0][i - 1];
}
for (int i = 1; i<m; i++)
{
for (int j = 1; j<n; j++)
{
if (!obstacleGrid[i][j])
{
dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
}
}
}
return dp[m - 1][n - 1];
}
int main()
{
int m = 3, n = 3;
vector<vector<int>> vec(m, vector<int>(n, 0));
vec[1][1] = 1;
cout<<uniquePathsWithObstacles(vec)<<endl;
system("pause");
return 0;
}
64 最短路径问题
原文:https://blog.csdn.net/u014615155/article/details/77941488
题目描述
题目原文:
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.
Note: You can only move either down or right at any point in time.
给定一个 M×N 的,元素为非负数的矩阵,找出从左上角元素到左下角元素经过的最短路径,并输出。
注意:其实note很有用的,只能向右走或者向下走。
题目分析
思路:
(错误:期初我想既然每次只能往右或者往下走,那我每次只需要比较一下右面和下面方格的值哪个小选哪个就可以了,但是细想局部最优≠整体最优,大家简单画个图就知道了~)
从头捋捋,假设M和N都很大,只能向右走,那么第一行的每个方格的最短路径的唯一确定的,长度即为当前方格内数字加上列数在当前方格之前的所有方格内数字之和;第一列同理。那么要求第二行第二列方格的最短路径:只需要比较一下第一行第二列方格最短路径值与第二行第一列方格的最短路径值哪一个更小,小的数值加上当前方格内数值即为所求…要求第i行第j列方格的最短路径:只需要比较一下第i行第j-1列方格最短路径值与第i-1行第j列方格的最短路径值哪一个更小,小的数值加上当前方格内数值即为所求。
所以最终思路为:循环M×N方格矩阵,依次求出从左上角方格到当前的最短路径并记录在当前方格中,直至运算到右下角方格即可。
本文来自 peerless_dulin 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/u014615155/article/details/77941488?utm_source=copy
代码
#include<iostream>
#include<vector>
using namespace std;
int min(int a, int b)
{
return a <= b ? a : b;
}
int minPathSum(vector<vector<int>>& grid) {
int m = grid.size();
if (m == 0)
return 0;
int n = grid[0].size();
vector<vector<int>> dp(m, vector<int>(n, 0));
dp[0][0]=grid[0][0];
for (int i = 1; i<m; i++)
{
dp[i][0] = dp[i - 1][0]+grid[i][0];
}
for (int i = 1; i < n; i++)
{
dp[0][i] = dp[0][i - 1] + grid[0][i];
}
for (int i = 1; i<m; i++)
{
for (int j = 1; j<n; j++)
{
dp[i][j] = min(dp[i - 1][j] , dp[i][j - 1])+grid[i][j];
}
}
return dp[m - 1][n - 1];
}
int main()
{
//int m = 3, n = 3;
//vector<vector<int>> vec(m, vector<int>(n, 0));
vector<vector<int>> vec = { {3,5,4},{1,2,6},{4,7,1} };
vec = { {3,5,4},{1,2,6},{4,7,1} };
cout<< minPathSum(vec)<<endl;
system("pause");
return 0;
}