对做过的动态规划题目进行汇总。
题目难度 | 题目链接 | 题目 | ||
中等 | LC3.无重复字符的最长子串 | s = 'abcabcbb' 3 | 一维 i 对字符串的遍历 | dp[i]代表以i字符结尾时候 最长的无重复字符串(一直维护最长数即可) 若 s[i] 在 dp[i-1] 中 截取a位置之后在加上a 则为dp[i] 若s[i]不在dp[i-1]中 则直接在dp[i-1]后直接加即可。 |
中等 | LC 718. 最长重复子数组 | str1: bbbabcddef str2: abcxef 求最长重复子数组长度 | 二维: i 遍历字符串1 j 遍历字符串2 | 当 str1[i]=str2[j] i或j等于0 :f[i][j] = 1 其他:f[i][j] = 1 + f[i-1][j-1] |
简单题 | LC338. 比特位计数 | 对于 0 ≤ i ≤ num 范围中的每个数字 i ,计算其二进制数中的 1 的数目并将它们作为数组返回。 | 一维: i 数字i | d[i]代表数字i的二进制数中的1的个数 d[i] = d[i-1] +1 i为奇数 |
简单题 | LC70. 爬楼梯 | 爬n阶楼梯, 每次可以爬 1 或 2 个台阶。有多少种不同的方法可以爬到楼顶 | 一维: i 可选择爬的阶数 | f(i) = f(i-1) + f(i-2) |
简单 | Offer 10-I 斐波那契数列 | 求第n个斐波那契数 | 一维: i 有n个斐波那契数可求 | dp[i] = dp[i-1] + dp [i-2] |
中等 | Offer 49. 丑数 | 求第 n 个丑数(只包含质因子 2、3 和 5 的数) | 一维: i 代表求的第i个丑数 | dp[i] = min(dp[a]*2, dp[b]*3, dp[c]*5) |
简单 | 背包问题 | n 件物品,所占空间为 w[i],价值为 c[i]。背包容量V,如何让背包物品总价值最大 | 二维: i 有n个物品可被选择 j 背包容量为V | d[i][j]=max(d[i][j-1],c[j-1]+d[i-w[j-1]][j-1]) |
中等 | LC474. 一和零 | 找出二进制字符串数组strs 的最大子集的大小,该子集中 最多 有 m 个 0 和 n 个 1 | 三维: i 背1的包的容量n j 被0的包的容量m k 有 l 个物品可被选择 | d[i][j][k] 代表 S1的数量为i、S2的数量为j时,添加到第k个物品时 物品的总量 d[i][j][k] = max(d[i][j][k - 1], 1 + d[i - zeros[k-1]][j - ones[k-1]][k-1]) |
中难题 | LC879. 盈利计划 | n 名员工,m种工作。每种工作分别产生profit[i] 的利润,要求group[i] 名成员共同参与 | 三维: i 有m个工作可被选择 j 有n个员工可被选择 k 背包容量(至少产生的利润minProfit) | d[i][j][k]当做第i个工作 员工在前j个员工中选择 产生利润为【至少为k】 的方案数 d[i][j][k]= max(d[i-1][j][k], d[i-1][j][k] + d[i-1][j-group[i-1]][max(0,k-profit[i-1])]) |
中等题 | LC1409.最后一块石头的重量 II | stones[i] 表示第 i 块石头的重量。每一次,从中选出任意两块石头,然后将它们一起粉碎。返回剩下最后一块石头的最小重量 | (pos-neg小,即sum-2neg小neg=sum/2时 可取到) 二维: i 可选择的n个石头 j 背包容量(neg) | d[i][j]= max(d[i-1][j], stones[i-1]+d[i-1][j-stones[i-1]]) |
中等题 | LC494. 目标和 | 非负数数组 nums 和一个整数 target。向数组中的每个整数前添加 '+' 或 '-'的运算结果等于 target 的不同 表达式 的数目。 | (分成pos neg 得到的neg视为背包的容量) 二维: i nums中有n个元素可被选择 j 背包容量(neg) | d[i][j] = max(d[i-1][j], d[i-1][j] + d[i-1][j-nums[i-1]]) |
中难题 | 华为机试.数组分割问题 | N个元素的正整数数组。分割为元素个数为N的两个和最接近的数组 | 三维: i 有N个元素可供选择 j 只能选择N/2个元素 k 背包容量(SUM/2) | d[i][j][k] 表示 从 i 个元素中 选择 j 个元素,其和 小于 SUM/2 的和 d[i][j][k] = max(d[i-1][j][k],nums[i] + d[i-1][j-1][k-nums[i]]) |