
动态规划
文章平均质量分 56
monzaid
这个作者很懒,什么都没留下…
展开
-
(动态规划)Educational Codeforces Round 107 (Rated for Div. 2) E. Colorings and Dominoes
题目:https://codeforces.ml/contest/1511/problem/EYou have a large rectangular board which is divided into n×m cells (the board has n rows and m columns). Each cell is either white or black.You paint each white cell either red or blue. Obviously, the numbe原创 2021-04-20 18:05:01 · 164 阅读 · 0 评论 -
(树形dp)hdu 5834 Magic boy Bi Luo with his excited tree
题目hdu5834题意:在一棵树上,每个结点都有不同的价值,每条边都有不同的代价,每个结点的价值只能获取一次,但是每经过一条边都要扣除相应的代价。输出从结点1~n 开始获取价值的最大值。思路:从结点开始获取价值的最大值 = max(子树回来 + parent不回来,parent回来 + 子树不回来)结点p 的子树s 回来和子树s 不回来的最大值好求:0表示不回来,1表示回来子树s 回来:遍历每个子树s(结点p 到结点s 的代价w),dp [ p ] [ 1 ] = max (dp [ p原创 2021-02-18 19:04:29 · 193 阅读 · 1 评论 -
(树形dp)hdu 3586 Information Disturbing
题目hdu3586题意:给出一个以结点1为根的树,切掉每一条边都有对应的代价,可以切掉任意条边,使得结点1到达不了这棵树所有的叶子结点,输出不超过代价m 的情况下的边的代价的最大值最小。举个例子:在m = 5 的条件下:思路:结点1到达不了这棵树所有的叶子结点 可以转化为 ∑\sum∑ 结点p 的下一层的子结点到达不了以子结点为根的子树所有的叶子结点的最小代价但是题目求的是不超过代价m 的情况下的边的代价的最大值最小,如果用上面的思路可能答案有些错,就像上个例子的第二种情况一样,所有要枚举不原创 2021-02-16 17:29:30 · 127 阅读 · 0 评论 -
(树形dp & 有依赖的背包)hdu 1011 Starship Troopers & hdu 1561 The more, The Better
题目hdu1011题意:一张图有 n 个结点,有 m 个士兵,每个士兵可以消灭 20 个虫子,结点1是入口,通过边可以走的任意一个结点并消耗结点上的虫子对应的士兵获得这个结点对应的脑子,当没有士兵后就不能继续往下走。另一种解释:有一个m个容量的背包,有 n 个物品,每个物品的一个代价u 和一个价值v,有些物品如果拿走需要对应的物品也被拿走,求m个容量最大的价值。(即背包9讲中的有依赖的背包)思路:每个结点p 的代价为c [ p ],价值为v [ p ]从结点1 dfs 下去,在每个结点p 中原创 2021-02-15 09:21:21 · 108 阅读 · 0 评论 -
(树形dp)poj 3140 Contestants Division
题目poj3140题意:有一张图,可以把其中一条边去掉把图分成两个部分,输出最小的两个部分的值的绝对差。思路:记录全图的总价值cnt;以结点1为根,dp [ i ] 为记录第 i 个结点向下的连通度。对于其中一个结点 p ,遍历与它有边的结点s1,s2,,,sn,ans=mini=1n∣dp[i]+v[i]−(cnt−(dp[i]+v[i]))∣=mini=1n∣(dp[i]+v[i])∗2−cnt∣ ans = \min_{i=1}^{n}|dp[i]+v[i]-(cnt-(dp[i]原创 2021-02-14 19:26:44 · 112 阅读 · 0 评论 -
(树形dp)poj 3107 Godfather
题目poj3107题意:有一棵树,以某个结点为根并切断这个结点使得它下一层子树的最大连通度的值最小,如果有这样的结点则输出结点的编号。思路:以结点1为根,记录每个结点向下的连通度(向上的连通度 = n - 向下的连通度)。对于其中一个结点 p ,遍历与它有边的结点s1,s2,,,sn,如果结点 si 的向下的连通度 < 结点 p 向下的连通度,那么这个结点 si 是结点 p 的子树,那么这个结点 si 在删除结点 p 后的连通度 = 这个结点 si 的向下的连通度。如果结点 si 的向原创 2021-02-14 16:30:03 · 135 阅读 · 0 评论 -
(树形dp)poj 2378 Tree Cutting
题目poj2378题意:有一棵树,以某个结点为根并切断这个结点使得它下一层所有的子树的连通度 ≤ n / 2,如果有这样的结点则输出结点的编号。思路:以结点1为根,记录每个结点向下的连通度(向上的连通度 = n - 向下的连通度)。对于其中一个结点 p ,遍历与它有边的结点s1,s2,,,sn,如果结点 si 的向下的连通度 < 结点 p 向下的连通度,那么这个结点 si 是结点 p 的子树,那么这个结点 si 在删除结点 p 后的连通度 = 这个结点 si 的向下的连通度。如果结点原创 2021-02-14 14:20:00 · 133 阅读 · 0 评论 -
(区间dp)poj 2955 Brackets
题目poj2955题意:给出字符串,求字符串中有(可以不连续)有多少对“ () " 和 “ [] ”思路:在区间 [ i , j ] 内,如果a [ i ] = ‘(’ 并且a [ j ] = ‘)’(或a [ i ] = ‘[’ 并且a [ j ] = ‘]’ ),则dp[i][j]=max(maxk=ij−1dp[i][k]+dp[k+1][j],dp[i+1][j−1]) dp[i][j]=max(\max_{k=i}^{j-1}dp[i][k]+dp[k+1][j], dp[i+1]原创 2021-02-13 23:43:58 · 110 阅读 · 0 评论 -
(区间dp)poj 1141 Brackets Sequence
题目poj1141题意:给出字符串,求使其成为常规字符串的最短字符串例如,以下所有字符序列都是常规方括号序列:(),[],(()),([]),()[],()[()]并且以下所有字符序列都不是:(,[,),)(,([)],([(]思路:dp数组是记录区间 [ i , j ] 成为常规字符串的最短次数。在区间 [ i , j ] 内,如果a [ i ] = ‘(’ 并且a [ j ] = ‘)’(或a [ i ] = ‘[’ 并且a [ j ] = ‘]’ ),则dp[i][j]=min原创 2021-02-13 22:39:47 · 110 阅读 · 0 评论 -
(区间dp)hdu 5115 Dire Wolf
题目hdu5115题意:有 n 头狼,打死一头狼,将受到与该狼当前攻击相同的伤害 + 当前相邻狼提供的额外攻击。并且该狼的相邻狼相邻(即有5头狼,打死了第二头狼,那么第一头和第三头相邻)。可以决定击败狼的次序。计算打败所有狼所需的最少伤害。思路:在区间[ i ,j ]内:dp[i][j]=mink=ijdp[i][k−1]+dp[k+1][j]+a[k]+b[i−1]+b[j+1] dp[i][j]=\min_{k=i}^{j}dp[i][k-1]+dp[k+1][j]+a[k]+b[i-1]原创 2021-02-13 14:27:23 · 160 阅读 · 0 评论 -
(环状区间dp)hdu 4745 Two Rabbits
题目hdu4745题意:输出环状数组的子序列(可以不连续)回文串的最长长度思路:把数组拉长一倍,在区间[ i ,j ]内:如果a [ i ] = a [ j ],则dp [ i ] [ j ] = dp [ i + 1 ] [ j - 1 ] + 2如果a [ i ] != a [ j ],则dp [ i ] [ j ] = max ( dp [ i + 1 ] [ j ], dp [ i ] [ j - 1 ] )有一种特殊情况,举个例子:环状数组是1,2,把数组拉长一倍是1,2,1,2原创 2021-02-13 11:53:30 · 120 阅读 · 0 评论 -
(区间dp) hdu 2476 String painter
题目hdu2476题意:给出字符串a和字符串b,你可以将字符串a的字符段更改为所需的任何其他字符。 输出字符串a更改为字符串b的最少次数。更改操作:举个例子,在字符串 qwer 中,可以在字符段[0, 2](即字符段qwe)更改为字符 z,即 qwer → zzzr思路:可以拆成两步,第一步是把空串更改为字符串b,第二步是根据第一步的结果推导出字符串a更改为字符串b空串更改为字符串b:在区间 i ~ j 内,如果字符串b [ i ] 在 区间 i+1 ~ j 内没有相同的字符,则dp [原创 2021-02-12 14:01:35 · 115 阅读 · 0 评论 -
(区间dp) hdu 4632 Palindrome subsequence
题目hdu4632题意:输出字符串中所有子序列回文串(可以不连续)的个数。as:aaa的所有子序列回文串是a(0),a(1),a(2),a(0)a(1),a(1)a(2),a(0)a(2),a(0)a(1)a(2) (括号里面的数字是这个字符在字符串中的坐标)思路:在区间i ~ j 中,如果a [ i ] != a [ j ],dp [ i ] [ j ] = dp [ i + 1 ] [ j ] + dp [ i ][ j - 1 ] - dp [ i + 1] [ j - 1]as:在原创 2021-02-11 00:59:40 · 116 阅读 · 0 评论 -
(区间dp)hdu 4283 You Are the One
题目hdu4283题意:一些人排队上场表演,第 k 个上场表演的人有 k - 1 * a[i] 的代价,有一个小黑屋(即栈),每个人可以进去小黑屋或直接上场表演,又或者是从小黑屋那里出去一个人上场表演(小黑屋是后进先出)。问如何合理利用小黑屋来以得到最小的代价。思路:在区间 i ~ j 内,a [ i ] 是第 k 个出场的,则区间 i+1 ~ i+k出场的代价 + a[i] * k + 区间 k+1 ~ j出场的代价 * (k+1)dp[i][j]=mink=ijdp[i+1][k]+dp[原创 2021-02-10 19:24:35 · 102 阅读 · 0 评论 -
(环状区间dp)hdu 3506 Monkey Party
题目hdu3506题意:环状石子合并思路:把数组拉长1倍 + 区间dp代码#include <iostream>#include <algorithm>#define DEBUG freopen("_in.txt", "r", stdin); freopen("_out1.txt", "w", stdout);using namespace std;const int MAXN = 2010;const int INF = 1e8;int a[MAXN],原创 2021-02-10 11:20:43 · 113 阅读 · 0 评论 -
(LCS)poj 1080 Human Gene Functions
题目poj1080题意:给出两个字符串,求它们匹配成功后(两个字符串长度要相等,不相等的话可以在较短的字符串加字符 ’-‘ 增长)的最大得分。得分=∑i=0str1.lenght()−1∑j=0str2.lenght()−1cnt(i,j) 得分 = \sum_{i=0}^{str1.lenght()-1} \sum_{j=0}^{str2.lenght()-1} cnt(i, j) 得分=i=0∑str1.lenght()−1j=0∑str2.lenght()−1cnt(i,j)cnt[原创 2021-02-09 17:17:47 · 117 阅读 · 0 评论 -
(LCS)hdu 1503 Advanced Fruits
题目hdu1503题意:两个字符串融合成一个字符串,使得这个字符串的子字符串(可以不连续)是给出的这两个字符串,并且这个融合的字符串的长度最小(可能有多个答案,输出其中一个即可)。as:apple + pear = applear,cranberry + boysenberry = boysecranberry(或craboysenberry)思路:先LCS,再根据LCS推出两个字符串相同字符的坐标,再根据这些坐标把两个字符串拆开再连接即可。代码#include <bits/stdc+原创 2021-02-08 22:26:39 · 128 阅读 · 0 评论 -
(LIS)hdu 1087 Super Jumping! Jumping! Jumping!
题目hdu1087题意:输出数组中的最大递增子序列和(可以不连续)思路:LIS的变形,把统计最大递增子序列长度换成统计最大递增子序列和即可(状态dp[ i ] 表示以第 i 个数为结尾的最大递增子序列和)。代码#include <bits/stdc++.h>#define DEBUG freopen("_in.txt", "r", stdin); freopen("_out1.txt", "w", stdout);using namespace std;const int M原创 2021-02-08 11:29:17 · 149 阅读 · 2 评论 -
(01背包)hdu 2955 Robberies
题目hdu2955题意:给出 n 家银行的金额和被抓的概率,求出不超出被抓概率 p 的最大抢劫金额。思路:如果把被抓概率看成背包容量进行dp,则wa,这里犯了一个常识的错误,被抓概率 = 被抓概率1 + 被抓概率2,其实这是错的。举个例子,某彩票的中奖概率是50%,按照上面的计算方法(中奖概率 = 中奖概率1 + 中奖概率2),那么买两张彩票则必中奖(两张彩票中奖概率 = 50% + 50% = 100%),这是不科学的。实际上两张彩票中奖概率为75%(两张彩票中奖概率 = 第一张中第二张不原创 2021-02-07 18:04:36 · 93 阅读 · 0 评论 -
(多重背包 + 二进制优化)hdu 2844 Coins
题目hdu2844题意:搞了很久,原来题目问的是有多少种付钱的金额(即硬币可以组成1元,2元,4元,5元,那么有4种付钱的金额),而不是最大的付钱金额是多少。。。思路:多重背包试了一下,TLE了只能多重背包 + 二进制优化了,as:有22枚硬币,可以拆成1 + 2 + 4 + 8 + 7枚硬币,这些硬币可以组成(1 ~ 22 )种选硬币的情况。dp数组记录的是在 i 金额的情况下最大的付钱金额。代码#include <bits/stdc++.h>#define DEBUG f原创 2021-02-07 14:02:12 · 127 阅读 · 0 评论 -
(完全背包 + 二维滚动数组)hdu 2159 FATE
题目hdu2159思路:有两个限制要求,一个是忍耐度,一个是杀怪数,用一个二维数组做dp,第一维是杀怪数,第二维是忍耐度,剩下的就是完全背包的思路了。代码#include <bits/stdc++.h>#define DEBUG freopen("_in.txt", "r", stdin); freopen("_out1.txt", "w", stdout);using namespace std;const int MAXN = 110;int a[MAXN], b[MAXN原创 2021-02-07 11:06:21 · 265 阅读 · 0 评论 -
(01背包)hdu 1864 最大报销额
题目hdu1864思路:因为金额是小数,所以可以金额 *100 再dp,输出的时候 / 100.0就可以了。ps:这种题目竟然不告诉报销额Q最大是多少,有点坑????,开一个3000000大小的数组(4000000可能会MLE)代码#include <bits/stdc++.h>#define DEBUG freopen("_in.txt", "r", stdin); freopen("_out1.txt", "w", stdout);using namespace std;c原创 2021-02-07 09:40:56 · 121 阅读 · 0 评论 -
(动态规划)cf Educational Codeforces Round 103 (Rated for Div. 2) D. Journey
题目:https://codeforces.com/contest/1476/problem/DThere are n+1 cities, numbered from 0 to n. n roads connect these cities, the i-th road connects cities i−1 and i (i∈[1,n]).Each road has a direction. The directions are given by a string of n characters s原创 2021-01-30 15:58:11 · 379 阅读 · 0 评论 -
(动态规划)cf Educational Codeforces Round 103 (Rated for Div. 2) C. Longest Simple Cycle
题目:https://codeforces.com/contest/1476/problem/CYou have n chains, the i-th chain consists of ci vertices. Vertices in each chain are numbered independently from 1 to ci along the chain. In other words, the i-th chain is the undirected graph with ci vert原创 2021-01-30 15:43:21 · 232 阅读 · 0 评论