ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

刷题Day20-动态规划(2)

2022-08-07 22:01:44  阅读:160  来源: 互联网

标签:obstacleGrid return int make Day20 ++ 动态 dp 刷题


62. 不同路径

一眼DP,最基础直白的动态规划,用空间换时间。

golang写一遍,复习下创建二维切片的方法

func uniquePaths(m int, n int) int {
    dp := make([][]int, m)
    for i := 0; i < m; i++ {
        dp[i] = make([]int, n)
        dp[i][0] = 1
    }
    for i := 0; i < n; i++ {
        dp[0][i] = 1
    }
    for i := 1; i < m; i++ {
        for j := 1; j < n; j++ {
            dp[i][j] = dp[i-1][j] + dp[i][j-1]
        }
    }
    return dp[m-1][n-1]
}

63. 不同路径 II

加上了障碍物,也挺简单的

func uniquePathsWithObstacles(obstacleGrid [][]int) int {
    m := len(obstacleGrid)
    n := len(obstacleGrid[0])
    dp := make([][]int, m)
    for i := 0; i < m; i++ {
        dp[i] = make([]int, n)
    }
    dp[0][0] = 1 - obstacleGrid[0][0]
    for i := 1; i < m; i++ {
        if obstacleGrid[i][0] == 1 {
            break;
        }
        dp[i][0] = dp[i-1][0]
    }
    for i := 1; i < n; i++ {
        if obstacleGrid[0][i] == 1 {
            break;
        }
        dp[0][i] = dp[0][i-1]
    }
    for i := 1; i < m; i++ {
        for j := 1; j < n; j++ {
            dp[i][j] = dp[i-1][j] + dp[i][j-1]
            if obstacleGrid[i][j] == 1 {
                dp[i][j] = 0
            }
        }
    }
    return dp[m-1][n-1]
}

343. 整数拆分

这个题挺有意义。一时间想不到用dp的做法。

主要思路是当前这个数因为可以和前面的数使用某个n相加得到。因此前面的那个数的dp值,乘以n,就是想要得到的结果,最后比较这些值里的最大值。

需要注意的地方是dp[i]如果i不是最后一个,那么dp[i]的最大值可以是i

func integerBreak(n int) int {
    dp := make([]int, n+1)
    if n == 2 {
        return 1
    }
    dp[1] = 1
    dp[2] = 2
    for i := 3; i <= n; i++ {
        if i != n {
            dp[i] = i
        }
        for j := 2; j < i; j++ {
            if dp[i] < dp[j] * (i - j){
                dp[i] = dp[j] * (i - j)
            }
        }
    }
    return dp[n]
}

96. 不同的二叉搜索树

本题还是挺难的。关键是不好分析出这是一道dp。

我的思路是当一个新节点到来的时候,把它插入到以前的树上,这样的思想是错误的。

主要思路是当一个新节点到来的时候,让每一个节点都当一次根节点,这样左右两边的子树就都有以前的影子,可以使用dp。

func numTrees(n int) int {
    dp := make([]int, n+1)
    if n == 1 {
        return 1
    }
    dp[0] = 1
    dp[1] = 1
    dp[2] = 2
    for i := 3; i <= n; i++ {
        for j := 0; j < i; j++ {
            dp[i] += dp[j] * dp[i - j - 1]
        }
    }
    return dp[n]
}

 

标签:obstacleGrid,return,int,make,Day20,++,动态,dp,刷题
来源: https://www.cnblogs.com/wangqianming12138/p/16559998.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有