刷题Day20-动态规划(2)
作者:互联网
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