动态规划五部曲:
- 确定dp数组以及下标的含义
- 确定递推公式
- dp数组如何初始化
- 确定遍历顺序
- 举例推导dp数组
力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
dp[i]的定义:到达第i台阶所花费的最少体力为dp[i]。
因为求最小的花费,而且上到第i层只能由i-1与i-2推出来因此
递推公式:dp[i]=min(dp[i-1]+cost[i-1],dp[i-2]+cost[i-2])
因为在第0层花费0,所以全部初始化为0
力扣题目链接 //不同路径
dp[i][j]含义为到i行j列位置有dp[i][j]种方案
递推公式为dp[i][j]=dp[i-1][j]+dp[i][j-1];
将第一行与第一列初始化为1
//不同路径2与之的区别在于初始化时障碍之后的地方为0而不是1,然后将地图内的做个if判断就行了
力扣题目链接 //拆分数字
dp[i]的定义:拆分数字i,可以得到最大乘积为dp[i],因此答案为dp[n]
递推公式:dp[i]=max(dp[i],j*dp[i-1],j*(i-j))
将dp[1]初始化为0或1,dp[2]初始化为1
01背包问题
dp[i][j]定义:在容量为j的背包中选择i件商品的最大价值为dp[i][j]
递推公式:如果(j<weight[i])dp[i][j]=dp[i-1][j],否则dp[i][j]=max(dp[i-1][j],dp[i-1][j-weight[i]]+value[i])
特殊情况特殊分析一般全部为0
滚动背包
就是降低空间复杂度
递推公式:j从题目给定的容量出发递减,j要大于等于weight[i]
然后dp[j]=max(dp[j],dp[j-weight[i]]+value[i])
如果要恰好装满则dp[0]为0,其他为负无穷,否则为0
力扣题目链接//分割等和子集 //能不能装满这个背包
完全没思路,看视频才会的,难的是根本想不到将题目与01背包串起来
分割成两个子集并且和相等,那么只要看数组中能不能选择值凑成sum/2,sum不能是奇数
递推公式与滚动背包一样的,只是里面的数值即为重量也为价值
力扣题目链接 //最后一块石头的重量II //背包容量最大能被装多满
与上一个题目一样,将sum/2看成容量,将重量看成价值,dp[i]找与sum/2最相近的值
力扣题目链接 //目标和 //装满这个背包有多少种方式 dp[j]+=dp[j-nums[i]];之前装满容量为j的背包方式加上dp【j-nums【i】】的方式
开始还是不知道跟01背包有啥关系,看了题解才知道都是一样的,只是看到题目没一点思路,与上面两题思路差不多 -
. - 力扣(LeetCode) //一和零
//装满这个背包有多个物品dp【I】【j】=fmax(dp[i-sum[k][0]][j-sum[k][1]]+1,dp[i][j]);