动态规划学习笔记

视频地址:https://www.bilibili.com/video/BV1xb411e7ww?from=search&seid=10475076981852959575

1. 动态规划题目类型

1.1. 按照题目求解目标分类
  1. 求最大最小值
  2. 计数:有多少种方式(走到右下角?选出k个数和为sum??)
  3. 求存在性(谁获胜?能不能选出k个数和为sum?)
1.2. 按照题目数据模型分类
  • 坐标型
  • 序列型
  • 划分型
  • 区间型
  • 背包型
  • 最长序列型博弈型
  • 综合型

2. dp组成部分一:确定状态

  • 状态是dp的定海神针,用一个数组记录,需要知道每个数组元素dp[i]代表什么,也可能是多维数组。
2.1. 如何确定状态?(个人认为是千变万化的dp题目中最大难点)
  • 最后一步:如果尝试通过递推的方式得到最后一步?
  • 子问题
  • 每个子问题对应一个状态,该状态满足最优子结构

3. dp组成部分二:转移方程(难点二)

2,5,7三种硬币,最少多少种硬币拼出X元为例:
F ( X ) = m i n F ( X − 2 ) , F ( X − 5 ) , F ( X − 7 ) F(X) = min{F(X-2), F(X-5), F(X-7)} F(X)=minF(X2),F(X5),F(X7)

4. dp组成部分三:初始条件和边界情况(易错点)

5. dp组成部分四:计算顺序(易错点)

从已经计算的部分,根据转移方程推出后面的部分。

6. 动态规划的实现方式(模板技巧)

  • 数组递推:少数题目只能使用这种方式实现
  • 记忆化搜索:绝大部分可以使用这两种方式实现,且记忆化dfs往往思路更直接。记忆化搜索的可变参数数量决定dp数组的维度,每个可变参数的范围就是dp数组各个维度对应的大小。
// 使用记忆化搜索实现dp

class Solution {
public:
    int dp[505][505];  // 使用C语言风格在外部定义dp数组,维度与dfs可变参数个数一致

    int mod = (int)1e9+7;
    int numWays(int steps, int arrLen) {
        //对dp数组进行初始化
        memset(dp, -1, sizeof(dp)); 
        return dfs(steps, 0, arrLen);
    }

    int dfs(int steps, int loc, int arrLen){
        // 对边界值进行判断
        if (steps < loc || steps < 0 || loc < 0)
            return 0;
        if (steps == loc)
            return 1;
        
        // dp记录值检测
        if (dp[steps][loc] != -1)
            return dp[steps][loc];
        
        // 递推公式实现
        dp[steps][loc] = dfs(steps - 1, loc, arrLen) % mod;
        if (loc > 0)
            dp[steps][loc] += dfs(steps-1, loc-1, arrLen) % mod;
        dp[steps][loc] %= mod;
        if (loc < arrLen - 1)
            dp[steps][loc] += dfs(steps-1, loc+1, arrLen) % mod;
        dp[steps][loc] %= mod;
        return dp[steps][loc];
    }
};
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值