欢迎光临散文网 会员登陆 & 注册

刷题第十八天

2023-08-28 11:00 作者:叶荜莉  | 我要投稿

45. 跳跃游戏 II:

这题可以用贪心,也可以用dp。dp做的话,dp 状态定义为到达某个位置所需的最小步数,dp[i] = min(dp[i - 1], dp[i - 2],...,dp[j + 1],dp[j]) + 1,dp[i - 1] >= dp[i - 2] >= ... >= dp[j + 1] >= dp[j],所以有dp[i] = dp[j] + 1 (0<=j <i),j是最早可以到达i的点。

70. 爬楼梯:

dp指爬当前阶数的方法数。初始化dp[1]=1,dp[2]=2,从3开始循环。

746. 使用最小花费爬楼梯:

这题的dp有多种写法。其中一种是,理解dp为到达当前阶要花费的最小cost。初始化dp[0]=0;dp[1]=0。从2开始循环dp[i]=min(dp[i-2]+cost[i-2],dp[i-1]+cost[i-1]),最后的答案是dp[cost.size()],因为这题的意思是到达顶,所以是cost.size()。

62. 不同路径:

经典dp,使用二维数组,初始化两条边界为1。dp[i][j]=dp[i-1][j]+dp[i][j-1]。

63. 不同路径 II:

这题和62是一样的思路,只是在初始化时如果遇到了障碍,就要break,障碍后面的一行或者一列都是0。在循环时,如果遇到障碍就跳过。

343. 整数拆分:

这题一开始一直纠结于dp[i]=max(dp[i],dp[j]*(i-j)),dp指当前的最大乘积,但是这样写一直出错,后来看了题解才知道,dp[j]*(i-j)是j有拆分,但如果j*(i-j),j不拆分时乘积更大呢?所以正确的状态转移方程是dp[i]=max(dp[i],max(dp[j]*(i-j),j*(i-j)))。

96. 不同的二叉搜索树:

这题挺难的。dp代表当前的二叉搜索树的种数,dp[0]等于1,空树也是一颗树。两层循环,dp[i]+=dp[j-1]*dp[i-j],外循环i,表示当前有多少节点。内循环j,从1到i,表示当前j为该树的根节点,j-1为左子树,i-j为右子树。




刷题第十八天的评论 (共 条)

分享到微博请遵守国家法律