dp
文章平均质量分 57
Lzed
我好菜啊
展开
-
Codeforces 803E - Roma and Poker(dp)
题目链接http://codeforces.com/contest/803/problem/E思路dp状态表示d[i][j]d[i][j],第i局得分为j是否成立转移方程这一局为?,即可能赢,输,平局:d[i][j]=d[i−1][j−1]|d[i−1][j+1]|d[i−1][j]d[i][j] = d[i - 1][j - 1] | d[i - 1][j + 1] | d[i - 1][j]原创 2017-05-04 17:01:46 · 308 阅读 · 0 评论 -
Leetcode 377 - Combination Sum IV(DAG上的dp)
题意给定一个数n和一个数组nums,要求用nums内的数去组成n,问多少种解法。顺序不同也算新的解法。思路其实就一DAG上路径统计问题 我们可以这样考虑:把0到target上的每个值看做一个点,如果能够从点A到点B的话, 我们就相当于可以连一条边,从点A到点B能够连边的充要条件是nums内存在一个数是B-A的值。然后就成了DAG上路径统计问题了。我们这样定义状态:d[j],当前需要凑出来的钱是j的原创 2017-01-24 15:33:56 · 213 阅读 · 0 评论 -
Leetcode 312 - Burst Balloons(区间dp)
题意给了一个数组n,代表n个气球,每个气球有一个值aia_i,现在,你每次可以扎破一个气球aiai,得到的收益为ai∗ai−1∗ai+1a_i*a_{i - 1}*a_{i +1}。最边上的ai−1a_{i - 1}或ai+1a_{i+1}即为1,求我们扎破所有气球得到的最大收益。思路明显的一个区间dp。状态表示:d[i][j]d[i][j],区间[i, j]的最大收益。然后我们需要考虑的就是如何定原创 2017-01-23 21:46:23 · 186 阅读 · 0 评论 -
Leetcode 72 - Edit Distance(dp)
题意就一编辑距离的题,支持操作:insert, delete, remove,求从x到y的最小edit distance思路状态表示:d[i][j]d[i][j],从x[0, i]到y[0, j]的最小编辑距离转移方程:x[i]==y[j]x[i] == y[j]:当前位置不用编辑,直接转化为更小的子问题:d[i−1][j−1]d[i -1][j - 1]x[i]≠y[j]x[i] \neq y原创 2017-01-23 15:56:31 · 218 阅读 · 0 评论 -
Leetcode 32 - Longest Valid Parentheses(线性dp)
题意给定一个括号序列,求其中合法的最长括号序列的长度思路很久以前做过一道类似的题,是用区间dp,O(n3)O(n^3)的时间复杂度过的,这道题O(n)O(n)的线性dp就可以了。 状态表示:d[i]d[i],以元素s[i]作为起点的最长括号序列。其实我们的括号序列无非就这两种情况的嵌套:()()和(())。根据以上的状态表示我们列出对应的d[]数组:( ) ( )4 0 2原创 2017-01-23 13:44:04 · 206 阅读 · 0 评论 -
Leetcode 413 - Arithmetic Slices(dp)
题意定义Arithmatic Slice:至少三个数,且相邻两个数之间的差是恒定的。 给定一个数组,求所有的Arithmatic Slice的数目。思路先这样考虑:假如我们已经有了一个长度为n的Arithmatic Slice序列了,那么它组成的所有AS一共有多少个?比如我们有:1,2,3,4,5。那么所有的AS包括:[1, 2, 3], [2, 3, 4], [3, 4, 5], [1, 2,原创 2017-01-20 20:46:17 · 228 阅读 · 0 评论 -
Leetcode 472 - Concatenated Words(dp)
题意给定一个字符串的列表,列表中的一些字符串能够由列表中的另外一些字符串拼接而成(至少两个)。问能够被拼接的字符串有哪些。思路其实和wordBreak那道题一样,只不过我们需要遍历一下待拼接的那个字符串。然后剩下的就是wordBreak一样了。细节注意我们用unordered_set来判断字符串是否存在的时候要注意去掉自身。代码const int maxn = 10005;int d[maxn];原创 2017-02-10 20:37:50 · 427 阅读 · 0 评论 -
Leetcode 10 - Regular Expression Matching(dp)
题意正则表达式匹配,可用的元字符为.和*。问p所代表的的正则表达式能否匹配s。思路分情况讨论清楚转移就好了。状态表示:d[i,j]d[i, j],s匹配到i,p匹配到j,是否能匹配成功。转移方程:pjp_j为alpha: si=pj:d[i,j]=d[i−1,j−1]s_i = p_j: d[i, j] = d[i - 1, j - 1]si≠pj:d[i,j]=0s_i \neq p_j:原创 2017-02-10 14:56:37 · 238 阅读 · 0 评论 -
Leetcode 516 - Longest Palindromic Subsequence(dp)
题意给定一个字符串,找最长回文子序列。思路今天好像刚加的新题?花了2min切掉了。 状态表示:d[i,j]d[i, j],区间[i, j]的最长回文子序列。转移方程:si==sjs_i == s_j: d[i,j]=d[i+1,j−1]+2d[i, j] = d[i + 1, j - 1] + 2si≠sjs_i \neq s_j: d[i,j]=max(d[i+1,j],d[i,j−1])d原创 2017-02-10 13:06:51 · 307 阅读 · 0 评论 -
Leetcode 132 - Palindrome Partitioning II(dp)
题意给定一个字符串,现在问将字符串最多分割几刀使每一段都是回文串?思路我们首先考虑因为要判断一段是否为回文串,因此需要先预处理出所有区间是否为回文串。状态表示:f[i,j]f[i, j],区间[i, j]是否为回文串。转移方程:f[i,j]=(si==sj?f[i+1,j−1]:0)f[i, j] = (s_i == s_j ? f[i + 1, j - 1] : 0)当我们预处理完成后,需要进行切原创 2017-02-10 13:05:26 · 226 阅读 · 0 评论 -
Leetcode 174 - Dungeon Game(二分+dp)
题意一个2D迷宫,公主在(m, n)的位置,骑士在(0, 0)的位置,并且有一个初始生命值。现在骑士要去(m, n)的位置,只能向右或者向上走。每个格子的位置上,都有BUFF和DEBUFF,现在要保持骑士在任何时刻的生命值都要大于0,求骑士的初始状态的最小生命值。思路算法1二分+dp。这是一个比较直观的思路,我们二分一下骑士初始的生命值,然后dp去判断是否合法。状态表示:d[i,j]d[i, j],原创 2017-02-09 23:12:23 · 260 阅读 · 0 评论 -
Leetcode 97 - Interleaving String(dp)
题意给出三个字符串s1, s2, s3。求s3是否是s1和s2的interleaving(大概是交织的意思?)。思路状态表示:d[i,j,k]d[i, j, k],s10is1_{0i}和s20js2_{0j}是否是s3ks3_k的interleaving。且k == i + j。转移方程:以下第三维的k只是为了转移方程方便看,实际可以不用表示,因为k == i + j。s1i≠s2js1_i \原创 2017-02-09 01:48:49 · 233 阅读 · 0 评论 -
HDU1506-Largest Rectangle in a Histogram(dp)
题目链接http://acm.hdu.edu.cn/showproblem.php?pid=1506思路就只需要找到当前每一个矩形,以它的高度,向左向右分别能延伸多长即可 直接暴力肯定会T,其实每次能延伸的都和上一次有关系,因此考虑dp 状态表示l[i]:以当前矩形的高度向左能延伸多少转移 如果h[i] ≥ h[i - 1],那么l[i] = l[i - 1] + 1,但是在i - 1 - l原创 2016-09-12 15:42:14 · 235 阅读 · 0 评论 -
Leetcode 85 - Maximal Rectangle(dp)
题意给定一个由01组成的矩形,要求找出矩形内由1组成的面积最大的矩形面积。思路之前写过一道类似的题,由若干个长度为1,高度不同的矩形连在一起,求最大矩形面积。这道题其实是类似的,我们只需要预处理出在位置[i, j]上,最大的1的高度,然后一行一行的处理,就和之前那道题相同了。状态表示:h[i,j]h[i, j],位置[i, j]上1的最大高度。l[i,j]l[i, j],位置[i, j]上,以h[i原创 2017-02-08 19:51:07 · 235 阅读 · 0 评论 -
Leetcode 221 - Maximal Square(dp)
题意给定一个由01组成的矩形,要求找出矩形内由1组成的最大正方形面积。思路状态表示:d[i,j]d[i, j],以位置为矩形右下角的最大正方形的边长。r[i,j]r[i, j],第i行,到第j个位置的1的长度。c[i,j]c[i, j],第j列,到第i个位置的1的长度。转移方程:d[i,j]=min{d[i−1,j−1]+1,r[i,j],c[i,j]}d[i, j] = min\{d[i - 1,原创 2017-02-08 15:20:56 · 176 阅读 · 0 评论 -
Leetcode 329 - Longest Increasing Path in a Matrix(dfs or dp)
题意给定一个矩形,求矩形中的最长增长路径。只能沿上下左右四个方向。思路算法1枚举起点,然后记搜。算法2排序 + dp创建一个节点node,包含矩阵中每个点的横坐标,纵坐标,值。然后按照值增长的顺序对node进行排序。然后问题转化成了一个变相的LIS。按照条件进行转移即可。代码algorithm 1int dx[] = {-1, 1, 0, 0};int dy[] = {0, 0, -1, 1};c原创 2017-02-22 15:11:36 · 310 阅读 · 0 评论 -
Leetcode 96 - Unique Binary Search Trees(dp or Catalan)
题意给定一个数n,求有n个节点的BST的数目(节点的值依次是1到n)。思路就一Catalan数。我们求解有3种方法:Cn=1n+1(2nn)C_n = \frac{1}{n + 1}{2n \choose n}Cn+1=2(2n+1)n+2CnC0=1C_{n + 1} = \frac{2(2n+1)}{n + 2}C_n \quad C_0 = 1dp:同Catalan数的公式证明首先,C原创 2017-01-24 21:35:40 · 160 阅读 · 0 评论 -
Leetcode122 - Best Time to Buy and Sell Stock II (dp)
题意给定一个股票的价格序列,你可以进行多次交易,在一天选择买入并在之后的某一天卖出,求能获得的最大利润。 要求:当买入一个股票时候不能买入新的股票思路一个多阶段决策问题,我们用d[i][0]d[i][0]表示我们第i天不持股,d[i][1]d[i][1]代表第i天持股,然后可以得到我们的转移方程: d[i][0]=max(d[i−1][0],d[i−1][1]+a[i])d[i][0] = ma原创 2017-01-28 18:02:05 · 219 阅读 · 0 评论 -
Leetcode 494 - Target Sum(01背包)
题意给定一个数组,现在可以在这个数组的每个数之前添加+或者-,求和为S的所有方案数(数组内数不能交换顺序)思路其实,每个数之前添加+或者-,就相当于这个数是选正数还是负数,就一01背包。状态表示:d[i][j]d[i][j],选过第i个数后,和为j的方案数。转移方程:d[i][j]=d[i−1][j−ai]+d[i−1][j+ai]d[i][j] = d[i - 1][j - a_i] + d[i原创 2017-01-24 20:25:55 · 1696 阅读 · 0 评论 -
Leetcode 309 - Best Time to Buy and Sell Stock with Cooldown(dp)
题意给定一个数组,其中aia_i代表第i天股票的价格为aia_i。你可以进行多次买卖,但是手中最多同时持有1支股票,并且某天卖出股票后,在那之后的一天不能进行任何买卖(cooldown)。 求能获得的最大利润。思路状态表示:d[i,j]d[i, j]代表第i天是否持股。j=1j = 1代表持股,j=0j = 0代表不持股。 状态转移: 1. 如果第i天不持股股票:可能是前一天就没有股票;或者前原创 2017-04-07 08:59:49 · 263 阅读 · 0 评论 -
Leetcode 546 - Remove Boxes(区间dp)
题意有一行方块,每个方块有颜色,现在可以把相邻的k个并且颜色相同的方块消除,得分为k⋅kk \cdot k,求最大得分。思路首先,做一步预处理优化时间:将相邻并且颜色相同的方块合并成段,用c[i]c[i]和len[i]len[i]分别记录这个段的颜色和里面的方块数目。于是以下的操作都是针对段进行。状态表示:d[i,j,k]d[i, j, k],区间[i,j][i, j]内,并且jj段之后还有kk个颜原创 2017-03-28 09:31:38 · 1267 阅读 · 0 评论 -
Leetcode 410 - Split Array Largest Sum(dp or 二分答案)
题意给定一个数组,将数组划分m组,要求每组的和的最大值最小思路算法1:dp首先我们这样考虑:我们要将前n个元素划分成m段,即先找一个划分点k,在[k + 1, n]不再划分。然后将[1, k]划分成m - 1段。那么就可以得到我们的状态表示和转移方程。状态表示:d[i,j]d[i, j],前i个元素,划分成j段的最大和。 转移方程:d[i,j]=min{max0≤k<i{d[k,j−1]},∑p=原创 2017-02-03 19:20:37 · 385 阅读 · 0 评论 -
Leetcode 213 - House Robber II(dp)
题意和之前的House Robber差不多,但是多了一个条件就是:房子围成的是一个环,即最后一个房子和第一个房子是连在一起的。思路状态表示和转移方程和House Robber一样。状态表示:d[i,j]d[i, j],是否选择第i个房子能够获得的最大价值。d[i,0]d[i, 0]代表不选择,d[i,1]d[i, 1]代表选择。 转移方程: d[i,0]=max(d[i−1,0],d[i−1,1原创 2017-02-03 01:43:47 · 337 阅读 · 0 评论 -
Leetcode 304 - ange Sum Query 2D - Immutable(dp)
题意给一个矩阵,每次给出一个(row1, col1, row2, col2),询问以(row1, col1)为左上角,(row2, col2)为右下角围成的矩形面积。思路维护一个数组s[i, j]表示:以(0, 0)为左上角,(i, j)为右下角围成的矩形面积。 那么我们的结果Q(row1,col1,row2,col2)=S[i,j]−S[i−1,j]−S[i,j−1]+S[i,j]Q(row1,原创 2017-02-03 00:19:55 · 237 阅读 · 0 评论 -
Leetcode 91 - Decode Ways(dp)
题意A到Z分别用0到26去编码,现在要求我们去解码,比如我们有“12”,可以解码为”AB“, 或者”L“。 给定一个数字串,求解码的方式一共有多少种。思路状态表示:d[i]d[i],到第i位的解码方式。 转移方程:d[i]=d[i−1]+d[i−2]d[i] = d[i - 1] + d[i - 2]转移方程很好列出来,但是转移条件要考虑清楚。 当d[i]+=d[i−1]d[i] += d[i原创 2017-02-02 19:03:29 · 190 阅读 · 0 评论 -
Leetcode 338 - Counting Bits(dp + 位运算)
题意给一个数num,求出0到num之间所有数的二进制表示中1的个数。思路首先,有这样一个事实:i & (i - 1)表示:将i的二进制表示中最低的那一位1置为0后的二进制表示。例如:9的二进制表示:1001,那么,9 & (9-1) = 1001 & 1000 = 1000。即i中1的个数比i & (i - 1)多1位。 状态表示:d[i]d[i],数i的二进制表示中1的个数。 转移方程:d[i原创 2017-02-02 17:28:33 · 178 阅读 · 0 评论 -
Leetcode 368 - Largest Divisible Subset(dp)
题意给一个set,要求找出这个set里面一个最大的子集,要求这个子集满足:子集中任意两个元素x, y,x%y==0x \% y == 0或y%x==0y \% x == 0。思路首先,该题基于这样一个事实:若b%a==0b \% a == 0且c%b==0c \% b == 0,那么c%a==0c \% a == 0。 然后,先排序,然后就会发现其实就是LIS问题,只不过限制条件不再是大于而是%。原创 2017-02-02 17:06:10 · 212 阅读 · 0 评论 -
Leetcode 375 - Guess Number Higher or Lower II(区间dp)
题意猜数字游戏,给定一个n,假设我从1到n里面选择了一个数作为我的target,如果我这次猜的x并且猜错了, 那么需要付出代价x,能够猜出1到n里面任意一个数的最小代价。思路这道题和之前的Guess Number Higher or Lower的不同之处在于:之前一道题是规定了每次猜中间一个数,因此值二分即可。这道题是每次可以从[L, R]里面猜任意一个数,但是要求总的代价最小。状态表示:d[i][原创 2017-02-01 18:14:39 · 208 阅读 · 0 评论 -
Leetcode 474 - Ones and Zeroes(01背包)
题意给定m个0个n个1,以及一堆字符串数组strs,要求你用这个m个0和n个1,去构成strs里面的字符串,求能够得到的最多字符串数目,可以剩余。思路就01背包,考虑第i个字符串是否选择。状态表示:d[i][j][k]d[i][j][k],去组成第i个字符串时,用了j个0,k个1能够得到的最多的字符串数目。 转移方程:d[i][j][k]=max(d[i−1][j−Zi][k−Oi]+1,d[i−原创 2017-02-01 17:17:41 · 339 阅读 · 0 评论 -
Leetcode 416 - Partition Equal Subset Sum(dp)
题意给定一个序列,将序列中的元素分为两组,要求这两组的和相同。思路两个数组和相同,即相减为0:若元素加入第一组,那么我们记为+,加入第二组,我们记为-,只需要最后的和为0即可。状态表示:d[i][j]d[i][j],选到第i个元素,和为j时是否成立。 转移方程:d[i][j]=d[i−1][j−ai]||d[i−1][j+ai]d[i][j] = d[i - 1][j - a_i] || d[i原创 2017-02-01 16:10:13 · 165 阅读 · 0 评论 -
Leetcode 123 - Best Time to Buy and Sell Stock III(dp)
题意给定一个股票的价格序列,你可以进行最多2次交易,在一天选择买入并在之后的某一天卖出,求能获得的最大利润。思路状态表示:d[I][j][k]d[I][j][k],我们第I天,(j == 0表示未持股),(j == 1表示持股),进行第k次交易的最大利润(当我们买入一只股票的时候 转移方程: d[i][0][k]=max(d[i−1][0][k],d[i−1][1][k]+a[i])d[i][0原创 2017-01-28 23:15:45 · 244 阅读 · 0 评论 -
Leetcode 363 - Max Sum of Rectangle No Larger Than K(前缀和+二分)
题意给一个矩阵,求矩阵内最大的和,并且该和不超过k。思路我们先考虑求最大子矩形和。 时间复杂度是O(n3)O(n^3)的。其基本思路就是降维。我们枚举L和R,分别代表起始列和终止列的起点和终点,这是O(n2)O(n^2)的,然后降维后,转化成了一个一维数组,求一维数组的最大区间和即可。时间复杂度O(n)O(n)。所以求最大子矩阵的面积是O(n3)O(n^3)的。然后对于这道题,我们可以用相同的思路原创 2017-02-14 18:12:18 · 281 阅读 · 0 评论 -
Leetcode 139 - Word Break(线性dp)
题意给一个字符串S和一个字典wordDict,要求判断是否能用wordDict内的数组成S。思路算法1区间dp,时间复杂度O(n3)O(n^3)首先将wordDict内的字符串全部丢到unordered_set<string> has里面,方便查看有没有。状态表示:d[i,j]d[i, j],区间s[i, j]能否用has内的字符串表示。转移方程:d[i,j]=d[i,k]&&d[k+1,j]d[i原创 2017-02-06 21:49:53 · 241 阅读 · 0 评论 -
Leetcode 115 - Distinct Subsequences(dp)
题意给定两个字符串S和T,要求删除S中的某些字母使其成为T,问方案数。思路编辑距离的变形问题。状态表示:我们记d[i,j]d[i, j],从S[0, i]转换到T[0, j]的方案数。转移方程:Si==TjS_i == T_j:即当前位置不用考虑,或者删除SiS_i再考虑,即:d[i,j]=d[i−1,j−1]+d[i−1,j]d[i, j] = d[i - 1, j - 1] + d[i - 1原创 2017-02-05 14:11:31 · 208 阅读 · 0 评论 -
Leetcode 403 - Frog Jump(dp or bfs)
题意给定一个石头的序列,青蛙从0开始跳,第一次只能跳一步,不能落入水中。现在,假如我从上一个石头跳到这个石头是k步,那么,我们下一次只能跳k - 1或k或k + 1步,问:青蛙最后能否调到最后一个石头上。思路算法1爆搜,本来以为会T,但是实际上中间会有很多情况会落入水中,所以bfs能过。算法2dp,我们可以这样考虑:我们当前在位置i,是从位置j经过k步到达位置i的。那么我们下一次能够达到stones原创 2017-02-04 21:21:27 · 205 阅读 · 0 评论 -
UVA11795-Mega Man's Mission(状压dp)
题目链接http://acm.hust.edu.cn/vjudge/problem/31961思路题目中n最大到16,因此考虑状压dp 定义状态d[i][s]:当前已经消灭了i个机器人,并且消灭过的机器人的状态为s的总方案数 转移方程:d[i][s] = sum(d[i - 1][ps]); 其中s和ps只有一位不同,并且s中1的个数比ps中1的个数多1 边界:d[0][0] = 0 目标:原创 2016-09-03 16:36:58 · 232 阅读 · 0 评论 -
UVA4731-Cellular Network(概率dp)
题目链接http://acm.hust.edu.cn/vjudge/problem/17270思路要使数学期望最小,明显可以看出来概率越大的应该先选,因此先将所有c[i]按照概率从大到小排序后进行dp 定义状态d[i][x]:目前选到第i组,当前选择的元素的是第x个的数学期望 转移方程:代码#include <iostream>#include <cstring>#include <stac原创 2016-09-03 14:11:30 · 206 阅读 · 0 评论 -
UVA10534-Wavio Sequence(LIS)
题目链接http://acm.hust.edu.cn/vjudge/problem/19219思路只需正向和逆向分别做一次LIS,然后ans = 2 * min(d1[i], d2[i]) - 1代码#include <iostream>#include <cstring>#include <stack>#include <vector>#include <set>#include <ma原创 2016-09-02 15:33:24 · 220 阅读 · 0 评论 -
最长上升子序列LIS(dp)
分析最长上升子序列:对于一个序列A[],找出一个子序列x[], 使xi < xj(i < j),xi 和xj不一定连续,求最长的一个子序列 O(n^2)做法: 定义状态:d[i]为当前元素作为最后一个元素的LIS长度 转移方程:d[i] = max{d[j] + 1 | i > j && a[i] > a[j]}; 目标:max(d[i]) 状态:O(n), 转移O(n),时原创 2016-09-02 15:21:33 · 305 阅读 · 0 评论 -
UVALive4256-Salesman(dp)
题目链接http://acm.hust.edu.cn/vjudge/problem/21665思路状态:d[i][x]对第i个数,并且该数为x,修改的最少次数 转移方程:d[i][x] = min{d[i - 1][y] + (x == a[i] ? 0 : 1) | x == y || G[x][y]};代码#include <iostream>#include <cstring>#incl原创 2016-09-02 14:45:04 · 252 阅读 · 0 评论