坐标型动态规划
-
unique path: 有一个m*n的网格。问从左上角到右下角有多少种不同的走法?
-
unique path II: 有一个m*n的网格,网格上有若干障碍物,不能经过障碍物。问从左上角到右下角有多少种不同的走法?
-
minimum path sum: 有一个m*n的网格,每个网格中都有一个非负数,求从左上角到右下角的所有路径中的最小路径和是多少?能试着返回这条最小路径吗(使用dp)?
-
bomb enemy: 有一个m*n的网格,每个网格上能放置空、敌人、墙三种中的一种,炸弹只能放置在空中,且能炸死同行同列的所有敌人,但是不能穿透墙,问在网格中放置一枚炸弹最多能炸死多少敌人?
序列型动态规划
-
paint haose: 有一排N栋房子,每栋房子要漆成3种颜色中的一种,任何两栋相邻的房子不能漆成同样的颜色,房子i染成第j中颜色的花费是cost[i][j],问油漆这些房子的最小花费是多少?
-
paint hause II: 有一排N栋房子,每栋房子要漆成K中颜色 中的一种,任何两栋相邻的房子不能漆成同样的颜色,房子i染成第j中颜色的花费是cost[i][j],问油漆这些房子的最小花费是多少?
- 确定状态
- 状态转移方程
- 初始化和边界情况
- 计算顺序
-
hause robber: 一排房子,小偷偷房子,相邻房子不能偷,问小偷最多能偷多少金币?
-
hause robber II: 一排房子变成一圈房子,还是相邻房子不能偷,问小偷最多能偷多少金币?
分两种情况:
- 第一个房子不偷的情况,最大的偷盗金额就是第1栋~第N栋
- 第一个房子偷的情况,最大的偷盗金额就是第1栋~第N-1栋
-
股票题:
-
最长上升子序列:
-
俄罗斯套娃信封: 给定N个信封的长度和宽度,如果一个信封的长度和宽度分别小于另一个信封的长度和宽度,则这个信封可以放入各一个信封里面,问最多可以嵌套放置多少个信封?
这个题类似于无矛盾的球队那一题:每个队员有年龄和实力两个属性,当球员间的年龄和实力不成正比例时会产生矛盾,问要组建一支没有矛盾的球队且这支球队的最强实力是多少?结题的方法是先对球员两个属性中的一个属性进行排序,比如说年龄,然后以年龄排序后的这个序列中查找最长上升子序列即可。简而言之就是先排序然后使用经典的最长上升子序列算法。
套娃信封这个题不难发现与无矛盾球队这个题是一个套路,思路是先对信封的一个属性为基准进行排序,然后对另一个属性实施最长上升子序列算法,就可得出结果。
划分型动态规划
-
perfect squares: 给定一个正整数N,问最少可以将N分成几个完全平方数之和?
- 确定状态:
- 最后一步:关注最优策略中最后一个完全平方数j^2
- 最优策略中n-j^2也一定被划分成最少的完全平方数之和
- 因此需要知道n-j^2最少被分为几个完全平方数之和
- 原来是求n被分为几个完全平方数之和,到这里子问题就显现出来了
- 状态:设f[i]表示i最少被分成几个完全平方数之和
- 状态转移方程
- 初始化及边界情况
- 计算顺序
- 确定状态:
-
Parlindrome Partition: 给定一个字符串S[0…N-1],要求将这个字符串划分成若干段,每一段都是一个回文串,求最少被划分几次?
-
copy books: 有N本书需要被抄写,第i本书有A[i]页,i=0~N-1,有k个抄写员,每个抄写员可以抄写连续的若干本书,每个抄写员的抄写速度都一样,都是一分钟一页,最少需要多少时间抄写完所有书?
这题可以这样理解:需要找到一种分段方式,分成不超过K段,使得所有段的数字的最大值最小(极小化极大)。
-
decode ways: 有一段由a~z字母组成的字符串被加密成数字,加密方式是a-1,…,z-26,问给你一个数字,有多少种合法的解密方式?(如12 -> l or ab)
-
decode ways II: 和上面一道题的整理描述一致,就是把加密规则从原来的a-1,…,z-26改为a-0,…,z-25。想想该怎么做?
区间型动态规划
博弈型动态规划
博弈型动态规划不同与其他所有动态规划,它是从第一步开始分析的。
- 石子游戏
背包型动态规划
-
backpack: 给定N个物品,重量分别为正整数A0 ~ An,一个背包最大承重是正整数M,最多能带走多重的物品?
背包问题中数组大小和总承重有关。
-
backpack II: 给定N个正整数: A0 ~ An-1,一个正整数target,求有多少种组合加起来是target,每个Ai只能使用一次?