70 . 爬楼梯
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
注意:给定 n 是一个正整数。
示例 1:
输入: 2
输出: 2
解释: 有两种方法可以爬到楼顶。
1. 1 阶 + 1 阶
2. 2 阶
示例 2:
输入: 3
输出: 3
解释: 有三种方法可以爬到楼顶。
1. 1 阶 + 1 阶 + 1 阶
2. 1 阶 + 2 阶
3. 2 阶 + 1 阶
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/climbing-stairs
int climbStairs(int n){
if(n==1)return 1;
int dp[n+1];
dp[1]=1;
dp[2]=2;
for(int i=3;i<n+1;i++){
dp[i]=dp[i-1]+dp[i-2];
}
return dp[n];
}
62. 不同路径
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。
问总共有多少条不同的路径?
例如,上图是一个7 x 3 的网格。有多少可能的路径?
说明:m 和 n 的值均不超过 100。
示例 1:
输入: m = 3, n = 2
输出: 3
解释:
从左上角开始,总共有 3 条路径可以到达右下角。
1. 向右 -> 向右 -> 向下
2. 向右 -> 向下 -> 向右
3. 向下 -> 向右 -> 向右
示例 2:
输入: m = 7, n = 3
输出: 28
( 来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/unique-paths )
动态方程:dp[i][j] = dp[i-1][j] + dp[i][j-1]
注意,对于第一行 dp[0][j],或者第一列 dp[i][0],由于都是在边界,所以只能为 1
优化:因为我们每次只需要 dp[i-1][j],dp[i][j-1]
作者:powcai 链接:https://leetcode-cn.com/problems/unique-paths/solution/dong-tai-gui-hua-by-powcai-2/
int uniquePaths(int m, int n){
if (0 == m || 0 == n) return 1;
int dp[m][n];
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (0 == i || 0 == j) dp[i][j] = 1;
else {
dp[i][j] = dp[i][j - 1] + dp[i - 1][j];
}
}
}
return dp[m - 1][n - 1];
}
64.最小路径和
给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。
说明:每次只能向下或者向右移动一步。
示例:
输入:
[
[1,3,1],
[1,5,1],
[4,2,1]
]
输出: 7
解释: 因为路径 1→3→1→1→1 的总和最小。
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/minimum-path-sum
相比上一题,这个是从底层往上求值。
我们新建一个额外的 dp 数组,与原矩阵大小相同。在这个矩阵中,dp(i, j)dp(i,j) 表示从坐标 (i, j)(i,j) 到右下角的最小路径权值。我们初始化右下角的 dpdp 值为对应的原矩阵值,然后去填整个矩阵,对于每个元素考虑移动到右边或者下面,因此获得最小路径和我们有如下递推公式:
dp(i, j)= \mathrm{grid}(i,j)+\min\big(dp(i+1,j),dp(i,j+1)\big)
dp(i,j)=grid(i,j)+min(dp(i+1,j),dp(i,j+1))
注意边界情况。
作者:LeetCode
链接:https://leetcode-cn.com/problems/minimum-path-sum/solution/zui-xiao-lu-jing-he-by-leetcode/
#define Min(a,b) ((a)<(b)?(a):(b));
int minPathSum(int** grid, int gridSize, int* gridColSize){
if(grid==NULL)return 0;
int col=* gridColSize;
int dp[gridSize][col];
for (int i = gridSize-1; i >= 0; i--) {
for (int j = col- 1; j >= 0; j--) {
if(i == gridSize - 1 && j != col - 1)
dp[i][j] = grid[i][j] + dp[i][j + 1];
else if(j ==col - 1 && i != gridSize - 1)
dp[i][j] = grid[i][j] + dp[i + 1][j];
else if(j != col- 1 && i != gridSize - 1){
dp[i][j] = grid[i][j] + Min(dp[i + 1][j], dp[i][j + 1]);}
else if(i == gridSize - 1 && j ==col - 1)
dp[i][j] = grid[i][j];
}
}
return dp[0][0];
}
来源:CSDN
作者:maryTime
链接:https://blog.csdn.net/maryfei/article/details/103881733