动态规划题目(C语言)

百般思念 提交于 2020-01-07 21:59:04

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] 是到达 i, j 最多路径

动态方程:dp[i][j] = dp[i-1][j] + dp[i][j-1]

注意,对于第一行 dp[0][j],或者第一列 dp[i][0],由于都是在边界,所以只能为 1

时间复杂度:O(m*n)O(m∗n)

空间复杂度:O(m * n)O(m∗n)

优化:因为我们每次只需要 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];

}

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!