Skip to content

算法练习:常用算法设计思想之四——动态规划(Dynamic Programming) #23

@ShannonChenCHN

Description

@ShannonChenCHN

题目列表

总结

  • 看到题目后,首先要分析能不能用动态规划解,一般先试试用暴力穷举法能不能做出来,然后再看是否符合”一个模型三个特征“
  • 绝大多数动态规划的问题都是一维和二维的,只有极少数会涉及到三维(比如123. 买卖股票的最佳时机 III)
  • 动态规划解题五步曲
    • 状态定义:这个往往跟题目中要求的最优解有关,一般是直接相关,也有个别情况并不是直接相关,比如 300. 最长递增子序列
    • 状态转移方程:写状态转移方程时需要考虑到遍历的维度,也就是状态是怎么转移的,一般都是比较简单的 i j 递增,但是有些特殊情况也要具体分析,比如 5. 最长回文子串 这一题
    • 状态初始化:写完状态转移方程之后,还需要考虑到一些边界条件,也就是状态初始化
    • 返回结果
    • 空间优化:AC 之后,再看看是否有空间优化的可能,一般情况下二维数组可以优化成一维数组(画矩阵表),一维数组可以优化成两个非集合类型的变量
  • 写完之后,一定要自己跑几个 case 验证一下,注意各种边界条件
  • 字符串比较求最优解这类问题一般都可以用动态规划求解,值得注意的是,一般定义状态时会把dp[i][j]表示前 i, j 个字符串的状态,但是在遍历字符串时一定要记得前 i 个字符串的最后一个字符是第 i-1 位而不是第 i 位。比如 10. 正则表达式匹配

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions