lintcode-solutions
  • LintCode 刷题笔记
  • 课程笔记
    • Backtracking
    • Binary Search
    • Divide & Conquer
    • Breadth First Search
    • Depth First Search
    • Linked List & Array
    • Two Pointers
    • Stack, Queue and Heap
    • Dynamic Programming
    • Two Pointers Advanced
    • Union Find and Trie
    • Dynamic Programming Advanced
  • 基础知识储备
    • Python
      • Stack and Queue
      • Namedtuple
      • Priority Queue
      • isinstance()
      • OrderedDict
      • set and frozen set
      • Counter
      • Heap
    • Bit Manipulation
    • Fenwick Tree or Binary Indexed Tree
    • Rabin-Karp Algorithm
    • Sort
      • Merge Sort
      • Quick Sort
      • Heap Sort
  • LintCode 练习题
    • Binary Search
  • OJ Review
    • Aug 7, 2018
    • Aug 8, 2018
    • Aug 9, 2018
    • Aug 13, 2018
    • Aug 17, 2018
    • Aug 19, 2018
    • Aug 24, 2018
    • Aug 26, 2018
    • Aug 27, 2018
    • Aug 29, 2018
    • Sep 1, 2018
    • Sep 2, 2018
    • Sep 3, 2018
    • Sep 4, 2018
    • Oct 28, 2018
    • Nov 13, 2018
Powered by GitBook
On this page
  • Dynamic Programming
  • Matrix DP
  • Sequence DP
  • Two Sequence DP
  • Backpack
  1. 课程笔记

Dynamic Programming

Dynamic Programming

由大化小, 小问题存在交集, 解决重复计算

DP 的实现方式

  1. 记忆化搜索 (递归)

  2. 循环

    1. 自顶向下

    2. 自底向上

如何想到需要用 DP 来解题?

  1. one of the following three indicators in problem description

    1. max / min

    2. yes / no (能否 ....)

    3. count(*)

  2. 原数组/序列不能排序, 交换位置 (不允许改变)

DP 四个要素

  1. 状态 State

    1. f[][] 表示 ....

  2. 方程 Function

    1. 研究如何从上一步走到下一步

  3. 初始化 Initialization

    1. 对那几个点进行初始化

  4. 答案 Answer

    1. 答案在哪里? f[n]? f[0]?

整理的 4 种 典型 DP

  1. Matrix DP

  2. Sequence DP

  3. Two Sequences DP

  4. Backpack DP

Matrix DP

  1. 状态 State

    1. f[x][y] 表示从起点走到坐标 (x, y) 的 .....

  2. 方程 Function

    1. 研究走到 (x, y) 这个点之前的一步

  3. 初始化 Initialization

    1. 对那几个点进行初始化? 边界? 顶点

  4. 答案 Answer

    1. 答案在哪里? f[n]? f[0]?

例题

  • Minimum Path Sum

  • Unique Path Sum I

  • Unique Path Sum II

解析

pass

Sequence DP

  1. State: f[i] 表示"前i"个位置/数字/字母, (以第i个为).....

  2. Function: f[i] = f[j] .... j < i

  3. Initialization: f[0] ....

  4. Answer: f[n - 1] ...

例题

  • Climbing Stairs

  • Jump Game

  • Palindrome Partitioning II

  • Word Break

  • Longest Increasing Subsequence

解析

pass

Two Sequence DP

  1. State: f[i][j] 代表第一 sequence 的前 i 个数字/字符, 配上第二个 sequence 的前 j 个数字/字符, .....

  2. Function: f[i][j] 研究 第 i 个和第 j 个的匹配关系

  3. Initialization: f[i][0] 和 f[0][i]

  4. Answer: f[s1.length()][s2.length()]

例题

  • Longest Common Subsequence

  • Longest Common Substring

  • Edit Distance

  • Distinct Subsequences

  • Interleaving String

解析

pass

Backpack

n 个整数 a[1, ..., n], 装满 m 的背包

  1. State: f[i][j] "前 i" 个数, 能否组成和为 j

  2. Function: f[i][j] = f[i -1][j - a[j]] or f[i - 1][j]

  3. Initialization: f[x][0] = True, f[0][1, ...., m] = False

  4. Answer: 使得 f[n][x] 最大的 (0 <= x <= m)

例题

  • Backpack

  • Backpack II

  • K Sum

  • Minimum Adjustment Cost

解析

pass

PreviousStack, Queue and HeapNextTwo Pointers Advanced

Last updated 5 years ago