动态规划dp

本文详细介绍了动态规划中的关键概念,包括确定dp数组的含义、递推公式的设置、初始化策略以及常见问题如背包问题(01背包、滚动背包)的实例。通过LeetCode题目链接,展示了如何将这些理论应用到实际编程中。
摘要由CSDN通过智能技术生成

动态规划五部曲:

  1. 确定dp数组以及下标的含义
  2. 确定递推公式
  3. dp数组如何初始化
  4. 确定遍历顺序
  5. 举例推导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背包有啥关系,看了题解才知道都是一样的,只是看到题目没一点思路,与上面两题思路差不多

  6. . - 力扣(LeetCode)   //一和零 
    //装满这个背包有多个物品dp【I】【j】=fmax(dp[i-sum[k][0]][j-sum[k][1]]+1,dp[i][j]);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值