Dynamic Programming - 62. Unique Paths
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?
Above is a 7 x 3 grid. How many possible unique paths are there?
Note: m and n will be at most 100.
Example 1:
Input: m = 3, n = 2 Output: 3 Explanation: From the top-left corner, there are a total of 3 ways to reach the bottom-right corner:
- Right -> Right -> Down
- Right -> Down -> Right
- Down -> Right -> Right
Example 2:
Input: m = 7, n = 3 Output: 28
思路:
题目意思是从一个m x n 的矩阵的左上方走到右下方 ,只能向下或者向右走,一共有多少种走法。同样,先看这个问题的最后一步,最后一步是走到第m行n列这个格子,问有多少种走法,那这个格子只能是从第m-1行第n列往下走一步或者第m行第n-1列往右走一步,由加法原则就可以知道,到达m行n列是这两种走法的和。所以就变成了得知道m行n-1列和m-1列n行的走法,这就是子问题,状态转移方程就是
dp[i][j]=dp[i-1][j] + dp[i][j-1]
,dp[i][j]代表了走到第i行第j列的走法。然后考虑初始条件和边界条件,dp[0][j]和dp[i][0]不能通过状态转移方程求出,所以这两个就是初始条件。 (可以在维度上优化为一维,状态转移方程变成dp[i] = dp[i-1] + dp[i]
,从左往右扫或者从上往下扫。以从上往下扫为例,当前dp[i]代表的就变成了走到dp[i]需要从左边往右走一步,也就时dp[i-1],和上一层的第i列那个格子往下走一步,也就是上一个dp[i])
代码:
go:
/*func uniquePaths(m int, n int) int {
if m <= 0 || n <= 0 {return 0}
// initial dp array
dp := make([][]int, m)
for i := 0; i < len(dp); i++ {
dp[i] = make([]int, n)
}
// find unique path
for i := 0; i < m; i++ {
for j := 0; j < n; j++ {
if i == 0 || j == 0 { // initialization
dp[i][j] = 1
} else {
dp[i][j] = dp[i][j-1] + dp[i-1][j]
}
}
}
return dp[m-1][n-1]
}*/
func uniquePaths(m int, n int) int {
if m <= 0 || n <= 0 {
return 0
}
dp := make([]int, n)
// find unique path
for i := 0; i < m; i++ {
for j := 0; j < n; j++ {
if j == 0 { // initialization
dp[j] = 1
} else {
dp[j] = dp[j] + dp[j-1]
}
}
}
return dp[n-1]
}```
- 温故而知新:HttpApplication,HttpModule,HttpContext及Asp.Net页生命周期
- proxy_pass反向代理配置中url后面加不加/的说明
- Android新手之旅(10) 嵌套布局
- C#代码也VB
- Docker容器学习梳理--SSH方式登陆容器
- Docker网络解决方案-Flannel部署记录
- Nginx的location配置规则梳理
- 统计代码行数的方法梳理
- 如何在不影响asp.net默认安全性的前提下使用ckeditor/fckeditor?
- Linux下防御DDOS攻击的操作梳理
- Android新手之旅(8) ListView的使用
- 更换Ubuntu源为国内源的操作记录
- Android新手之旅(8) ListView的使用
- CKEditor/CKFinder升级心得
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 实例分析PHP将字符串转换成数字的方法
- Laravel5.4框架使用socialite实现github登录的方法
- PHP删除字符串中非字母数字字符方法总结
- 实例讲解php将字符串输出到HTML
- PHP的mysqli_stat()函数讲解
- php中访问修饰符的知识点总结
- 浅谈keras 模型用于预测时的注意事项
- 使用Keras预训练好的模型进行目标类别预测详解
- keras输出预测值和真实值方式
- 对python pandas中 inplace 参数的理解
- PHP基于GD2函数库实现验证码功能示例
- PHP合并两个或多个数组的方法
- PHP的mysqli_set_charset()函数讲解
- PHP常见加密函数用法示例【crypt与md5】
- PHP的mysqli_sqlstate()函数讲解