1 不同路径
问题描述:
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。
问总共有多少条不同的路径?
思路
1 确定dp的含义
dp[i][j] 表示到达该位置的的路径数目
2 确定状态变化规则
因为只有从左边或者从上边 到达下一个位置,所以 dp[i][j] = dp[i-1][j] + dp[i][j-1]
3 初始化
当i==0 的时候,到达该该目标位置的路径数目是1
当j == 0 的时候, 到达该目标位置的路径数目为1
4 确定遍历 的顺序
由于后一个位置依赖于前一个位置,所以需要从前往后
5 举例
。。。。。。。
go语言实现
func uniquePaths(m int, n int) int {
res := make([][]int,m)
for i := range res {
res[i] = make([]int,n)
res[i][0] =1 //初始化
}
for j:= 0; j
2 不同路径2
问题描述:
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish”)。
现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?
网格中的障碍物和空位置分别用 1 和 0 来表示。
思路
其实和上面的思路是一样的,只是要考虑到障碍物,所以再初始化和状态转换的时候需要判断一下。
go语言实现
func uniquePathsWithObstacles(obstacleGrid [][]int) int {
m ,n := len(obstacleGrid) , len(obstacleGrid[0])
res := make([][]int,m)
for i := range res {
res[i] = make([]int,n)
}
// 当 在一条直线上遇到障碍物,后面必然无法到达,默认就是0了。
for i:=0; i
整数拆分
问题描述 :
给定一个正整数 n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化。 返回你可以获得的最大乘积。
思路:
1 确定dp
dp[i] 是 整数i 获得的最大乘积,
2 确定状态变化规则
dp[i] 可以是 j *(i-j),也可以是 j * dp[i-j]
所以每次遍历 j的时候,保留其中大的数。
dp[i] = max(dp[i], max( j* (i-j), j* dp[i-j]))
3 初始化
dp[1] =1
dp[2] =1
4 遍历顺序
从前往后,go
5 举例子
。。。
go语言实现
func integerBreak(n int) int {
//
res := make([]int,n+1)
res[1] = 1
res[2] = 1
for i:=3;ib {
return a
} else {
return b
}
}