• 动态规划笔记


    参考资料

    动态规划之背包问题系列
    背包九讲----整理+例题
    背包问题常见的有三个问法:

    完全背包和多重背包的二进制优化是什么?

    8.16 第一章

    什么题型可以用dp

    1. 动态规划可以解决三类问题
    • 求最值 (最大、最小)
    • 求方案数
    • 求可行性问题
      dp类问题肯定包含上面三个提问之一,但有上面问题之一不一定就是dp问题
    1. 如果一个数组满足不可交换时(具有方向性),是dp的信号之一(不是绝对的)

    题面

    198. 打家劫舍

    坐标型

      dp[坐标] = 行走到这个坐标的最优值
    

    特点:状态使用dp(坐标),如果是二维的,就用二维坐标表示,如果是一维就用一维坐标表示
    状态转移:关心从哪一个坐标跳过来的
    dp[i] = max(dp[i-1], max(dp[0]...dp[i-2]) + a[i]))
    增加一个状态进行优化,第二维1表示打劫或者0表示不打劫

    把决策(打劫或不打劫)记录到状态中去
    这就很像买卖股票,买或不买了

    dp[i][0] = max(dp[i-1][0], dp[i-1][1])
    dp[i][1] = dp[i-1][0] + a[i]

    不用往回推了吗,跟0 ~ i-2的状态没有关系了吗
    难以理解

    前缀型

      dp[i] = 前i个数的最优值
    

    特点: 前缀表示状态,如看前i个数取出的最大和,不关心第i个数取或者不取
    dp[i] = max(dp[i-1], dp[i-2]+a[i])

    8.16 第二章

    剑指 Offer 60. n个骰子的点数

    背包型

    1. 0/1背包
      f[i][j]表示前i个物品,j是和为j,是一堆数为和

    dp[i][j] 骰i次骰子和为j的概率
    影响概率的是骰子的个数、骰子点数的和,这两个都是变数,放到状态里考虑,所以状态是2维

    8.16 第三章

    32. 最长有效括号

    后缀型(和前缀型一样)

    dp[i]表示i ~ len-1 中,以i开始的最长有效括号长度

    8.19 第四章

    85. 最大矩形

    直方图最大矩阵
    单调栈
    每次将栈中比当前数据大的弹出,最后栈中剩下的数据压入一个0来弹出

    8.22 第五章

    假期
    公司给小q放了n天假,小q打算在假期中工作、锻炼、休息,他有个奇怪的习惯,不会连续两天工作或锻炼。
    只有公司营业时,才去工作,只有健身房营业时,采取锻炼。给出公司、健身房营业情况,计算出小q至少要休息几天?

    一个线索是决策当前去做什么事情,只与前一天的情况有关,跟之后、更前 都没有关系,这种很容易想到是dp
    输入:
    放假天数 4
    公司营业 1 1 0 0
    健身营业 0 1 1 0
    输出: 2

    j : 0 工作 1 锻炼 2 休息
    dp[i][j] 表示第i天做j这个事情,最小的休息天数
    滚动数组 dp[i%2]

    相关题目
    买卖股票

    8.22 第6章

    1049. 最后一块石头的重量 II
    给定一组石头,每个石头有一个正数的重量,每轮开始时,选择两个石头进行碰撞。假定两个石头的重量为x, y, x<=y,碰撞结果为

    1. 如果x == y,两个石头消失
    2. x!=y,两个石头消失并生成一个新石头重量为|x-y|
      最后最多剩一个石头结束,求最小的剩余石头重量
      输入:
      石头个数
      石头重量,空格分开

    背包型dp与数组中数据顺序无关、与方向无关
    本题可以转为01背包
    背包问题要再看下 01背包、完全背包、混合背包

    8.22 第7章

    1000. 合并石头的最低成本 类似
    312. 戳气球
    有n堆金币排成一排,第i堆有c[i]块金币。每次合并都将相邻的两堆金币合并为一堆,成本为两堆金币之和。最终合并为一堆,请计算合并为一堆的最低成本。

    区间型动态规划
    dp[i][j] 表示第i堆到第j堆合并的最小代价
    dp[i][j] = min(dp[i][j], dp[i][k] + dp[k+1][j] + sum[i][j])
    sum[i][j]表示i到j的和,可以用前缀和来实现

    大区间依赖小区间,注意两层循环实现问题
    研究最后一步要做啥 反向推,自顶向下的分治方法

    8.22 第8章

    字节 毕业旅行 traveling-salesman-problem
    状态压缩dp

    8.22 第9章

    美团:外卖满减
    n个菜,价格为prices[i],要选到x元,至少话费多少元
    应用反选法,
    01背包能不能凑出某个和

    这里涉及到选数求和的问题,一般是背包型动态规划。

    8.22 第10章

    256. 粉刷房子
    坐标型

    8.22 第11章

    最大子数组差 maximum-subarray-difference
    给一个整数数组,找出两个不重叠子数组a和b,使两个子数组和的差的绝对值最大 |sum(a) - sum(b)|

    相似题目 lintcode 1833 钢笔盒 1850 捡苹果

    8.22 第12章

    求方案总数、可行性 99%就是dp,求最大最小还不一定
    双色塔 two-colors-tower

    取模运算
    (a + b) / c = (a %c + b %c ) %c
    加 减 乘 都满足

    区间不重叠,考虑隔板法

  • 相关阅读:
    【SICP练习】80 练习2.52
    【SICP练习】79 练习2.51
    【SICP练习】78 练习2.50
    【SICP练习】77 练习2.48-2.49
    【SICP练习】76 练习2.47
    【SICP练习】75 练习2.46
    【SICP练习】74 练习2.45
    【SICP练习】73 练习2.44
    【SICP练习】72 练习2.43
    【SICP练习】71 练习2.42
  • 原文地址:https://www.cnblogs.com/holidays/p/dpnote1.html
Copyright © 2020-2023  润新知