动态规划--不同路径

题目描述

一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。问总共有多少条不同的路径?
在这里插入图片描述
这是一个基于动态规划的问题,是一个利用矩阵int[][]作为dp矩阵的记忆化搜索算法,必须掌握

题目分析

题目中提出,只能向下或向右,就限制了机器人的行走状态,也从另一方面隐含的告知,某一位置(i,j)的行走依赖与之前位置(i,j-1)(从左边格子走来,对应于向右走)、(i-1,j)(从上边格子走来,对应于向下走)。 这就可以推出状态转移(记忆化搜索)方程:

在这里插入图片描述

dp[i][j]代表在从(0,0)->(i,j)位置有多少种可能,因为题目规定,只能向右或者向下,所以对于任意一个位置(i,j)来说,取决于其左边和上边(i,j-1)、(i-1,j),所以对于第一个格子(起点)来说,其只有一种可能,即1。
在这里插入图片描述
紧接着对于(0,1)来说,由于只能向右或者向下走,其只能从(0,0)走来,即
在这里插入图片描述
这样就可以推出我们的状态转移方程dp[i][j] = dp[i-1][j] (向下走) + dp[i][j-1] (向右走) 对于第一行和第一列的位置,由于只能向右边或者下边走,所以都为1,即

在这里插入图片描述
这样就可以求出整个dp矩阵,最终的答案就是dp[2][2] (即右下角的值)

在这里插入图片描述

代码

class Solution {
    public int uniquePaths(int m, int n) {
        int[][] dp = new int[m][n];

        for (int i = 0; i <m ; i++) {
            for (int j =0; j <n; j++) {
                if(i == 0 && j == 0){
                    dp[i][j] = 1;
                    continue;
                }
                if(j!=0 && i != 0 ){
                    dp[i][j] = dp[i][j-1] + dp[i-1][j];
                }else{
                    dp[i][j] = i == 0?dp[i][j-1]:dp[i-1][j];
                }
            }

        }
        return dp[m-1][n-1];
    }
}
  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值