leetcode 62. Unique Paths

本文介绍了一种使用动态规划算法计算机器人从网格左上角到右下角的不同路径数量的方法。通过避免递归回溯中的重复计算,提高了算法效率。

A robot is located at the top-left corner of a m x n grid (marked ‘Start’ in the diagram below).

The robot can only move either down or right at any point in time. The robot is trying to reach the bottom-right corner of the grid (marked ‘Finish’ in the diagram below).

How many possible unique paths are there?
这里写图片描述
递归回溯都有计算重复
子问题重叠所以用动态规划
依次计算从右到左的红线上的方格
但是实现起来好麻烦 走的很迂回

这里写图片描述
这样就很方便了

public int uniquePaths(int m, int n) {// 4 6
        int[][] dp = new int[m][n];
        int i,j;
        for(int index = m*n-1;index >= 0;index--){
            i = index / n;
            j = index % n;
            if(index == m*n-1) dp[i][j] = 1;
            else{
                dp[i][j] = 0;
                if(i+1 < m) dp[i][j] += dp[i+1][j];
                if(j+1 < n) dp[i][j] += dp[i][j+1];
            }
        }
        for(i = 0;i < m;i++){
            for(j = 0;j < n;j++)
                System.out.printf("%4d",dp[i][j]);
            System.out.println();
        }
        return dp[0][0];
    }
虽然提供的引用中未包含LeetCode62题的C语言解决方案,但LeetCode62题是“不同路径”问题,其描述为:一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。问总共有多少条不同的路径? 可以使用动态规划来解决此问题,以下是C语言的实现代码: ```c #include <stdio.h> int uniquePaths(int m, int n) { int dp[m][n]; // 初始化第一行 for (int j = 0; j < n; j++) { dp[0][j] = 1; } // 初始化第一列 for (int i = 0; i < m; i++) { dp[i][0] = 1; } // 填充动态规划表 for (int i = 1; i < m; i++) { for (int j = 1; j < n; j++) { dp[i][j] = dp[i - 1][j] + dp[i][j - 1]; } } return dp[m - 1][n - 1]; } int main() { int m = 3; int n = 7; int result = uniquePaths(m, n); printf("不同路径的数量: %d\n", result); return 0; } ``` ### 代码解释 1. **动态规划数组初始化**:创建一个二维数组`dp[m][n]`,将第一行和第一列初始化为1,因为到达第一行或第一列的任意位置只有一种路径。 2. **状态转移方程**:对于其他位置`(i, j)`,到达该位置的路径数等于到达其上方位置`(i - 1, j)`的路径数加上到达其左方位置`(i, j - 1)`的路径数,即`dp[i][j] = dp[i - 1][j] + dp[i][j - 1]`。 3. **返回结果**:最终结果存储在`dp[m - 1][n - 1]`中。 ### 复杂度分析 - **时间复杂度**:$O(m * n)$,需要填充整个动态规划表。 - **空间复杂度**:$O(m * n)$,使用了一个二维数组来存储中间结果。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值