509. 斐波那契数
dp[i]:i的斐波那契数。
当前的斐波那契数是前一个和前两个斐波那契数之和,因此递推公式dp[i]=dp[i-1]+dp[i-2]
70. 爬楼梯
dp[i]:爬到i层可以有i种爬法。
初始化dp[i]=1,dp[2]=2,第i层的爬法等于前一层阶梯爬一层或在前两层阶梯爬两层(前两层阶梯爬一层就等于是前一层阶梯爬一层,因此不用重复计算),因此第i层爬法等于第i-1层爬法+第i-2层爬法。dp[i]=dp[i-1]+dp[i-2]
746. 使用最小花费爬楼梯
dp[i]:爬到i层最小的花费
第一步需要花费。dp[0]=cost[0],之后每次的dp[i]都为上一层或上两层的花费小值+cost[i].
dp[i]=Math.min(dp[i-1],dp[i-2])+cost[i];
最后一步不需要花费,最后直接return dp[cost.len-1],dp[cost.len-2]中的小值即可。
62.不同路径
dp[i][j]:走到dp[i][j]的方法总和
初始化dp[i][0],dp[0][j]都为1.
机器人只能走右/下方,因此当前格子的走法为上方格子往下走+左方格子往右走。即上方和左方的方法之和。递推公式:dp[i][j]=dp[i-1][j]+dp[i][j-1];
最后returndp[m-1][n-1]
63. 不同路径 II
本题和62的区别在于多了障碍物。
dp[i][j]:走到dp[i][j]的方法总和
初始化dp[i][0],dp[0][j]都为1.遇到障碍物,则障碍物处于的位置方法置为0,若障碍物位于第一行/列,则第一行/列障碍物之后的格子都置为0.
递推公式:dp[i][j]=dp[i-1][j]+dp[i][j-1];
最后returndp[m-1][n-1]
343. 整数拆分
dp[i]:和为i的值拆分出的最大乘积为dp[i]
i可以拆分出两种,i*(i-j)以及i*dp[i-j];
j * (i - j) 是单纯的把整数拆分为两个数相乘,而j * dp[i - j]是拆分成两个以及两个以上的个数相乘。
i从2开始遍历,j从1开始遍历到i-j,每次取当前dp[i],i*(i-j),i*dp[i-j]的最大值作为dp[i]的值。