[算法数据结构] 动态规划

103 阅读2分钟

总结以下几道题:使用最小花费爬楼梯、不同路径、不同路径II、整数拆分、不同的二叉搜索树。

  • 使用最小花费爬楼梯

和之前爬楼梯的方法不同,这回爬每一个台阶需要花费。模拟爬楼梯的过程,由于一开始可以从0 / 1 开始爬楼梯,因此可以理解为爬到0 / 1 台阶不需要花费。因此dp[0] = d[1] = 0,那么dp[2] = min(cost[1] + dp[1], cost[0] + dp[0])。

  • 不同路径

由于限定了只能向下或者向右走,因此才有有限条路径。由于从左上角出发,因此前往第一行的和第一列的只有一种方法,就是一直往右走,或者一直往下走。 dp[i][j]的含义是,从左上角出发到第i行第j列有几条方法。递推公式为dp[i][j] = dp[i - 1][j] + dp[i][j - 1] 从左边来的和从右变来的。遍历顺序根据走路的方法,从上到下,从左到右遍历。

  • 不同路径II

和上一题不同的是,有障碍。逻辑也比较清晰:初始化第一行第一列。当遇到障碍时,往后不再赋值,因为走不到了。在遍历的过程中,需要添加判断,当遇到障碍时不累加方法。

  • 整数拆分

如何实现拆分的情况的枚举?dp[i]拆分数字i,可以得到最大乘积dp[i]。dp[i] = max(dp[i], max(i - j ) .j, dp[i - j] * j))。因此通过叠加一层j 循环来实现对拆分情况的枚举。

  • 不同的二叉搜索树

给定一个整数 n,求以 1 ... n 为节点组成的二叉搜索树有多少种? 想到了1-n各自做根节点的情况,但是如何累加全部的情况,并且如何对树形结构进行建模?dp[i] 1到i为节点组成的二叉搜索树的个数为dp[i]。dp += dp[以j为头节点左子树节点数量] * dp[以j为头节点右子树节点数量]。不断累加。和整数拆分有相似之处。相似在,在循环整个dp数组的时候,为了探寻所有可能再嵌入了一层循环遍历。