Skip to content

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

Description

@ShannonChenCHN

题目列表

总结

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

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions