不同的路径,整数拆分(go)

1 不同路径

问题描述:
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。

机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。

问总共有多少条不同的路径?


image.png

思路

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 来表示。

image.png

思路

其实和上面的思路是一样的,只是要考虑到障碍物,所以再初始化和状态转换的时候需要判断一下。

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
    }
}

你可能感兴趣的:(不同的路径,整数拆分(go))