动态规划
文章平均质量分 75
AC_Arthur
Die luft der Freiheit weht
展开
-
UESTC Pick The Sticks (背包变形)
该题是15年CCPC的D题,背包变形,昨天队内组队赛和队友搞了出来 。 各种超时,能优化的地方都搞了才勉强过,应该是姿势不太对。细节参见代码:#include#include#includeusing namespace std;typedef long long ll;const double eps = 1e-6;const int INF = 1000000000;co原创 2015-11-01 10:54:48 · 941 阅读 · 0 评论 -
HDU 2836 Traversal(线段树+离散化+DP)
题目链接:点击打开链接题意:给你n个数的序列, 一个数h, 求相邻数之差不超过h的子序列的个数和 % 9901。思路:经典水题, 显然用d[i]表示以a[i]结尾的满足条件的子序列个数。 那么对于j = a[i] - h。 对于这个限制用线段树下标维护, 线段树用来维护d[i]的累加和。 细节参见代码: #include#include#include#include#原创 2016-03-29 17:38:08 · 1587 阅读 · 0 评论 -
HDU 1523 Decoding Morse Sequences(DP)
题目链接:点击打开链接题意:给出一个编码, 给n个单词的字典, 求有多少个字典中单词组成的语句可以编译成所给编码。思路:答案数很大, 我们不难想到要用动态规划的思想。 用d[i]表示到第i个编码为止的答案数, 那么起点就是d[0] = 1; 我们在第二层循环枚举n个单词的编码, 如果能匹配,就转移过去。细节参见代码:#include#include#include#in原创 2016-02-19 12:52:19 · 1272 阅读 · 0 评论 -
HDU 2227 Find the nondecreasing subsequences(线段树+离散化+DP)
题目链接:点击打开链接题意:给你n个数, 求非递减子序列的个数。思路:很容易想到, 用d[i]表示, 以a[i]为最后一个元素的非减子序列个数。 那么每次转移, 就是sum(d[j]) (其中 j 那么最终答案是所有d[i] (1 细节参见代码:#include#include#include#include#include#include#include#in原创 2016-03-29 16:41:28 · 632 阅读 · 0 评论 -
8VC Venture Cup 2016 - Elimination Round F. Group Projects(DP)
题目链接:点击打开链接题意:给n个人, 让我们分成若干组, 每组的值是最大值减去最小值, 求所有组的和。思路:显然, 需要用DP的思想, 但是该题DP设计的非常巧妙, 而且状态转移的情况容易考虑不全。我们用d[i][j][v]表示考虑了前i个数了, 有j个组是开放的(所谓开放指的是只有最小值, 还没有最大值, 还可以进人), 当前值之和为v 的方案数。我们先排序, 这样, 对于开放原创 2016-02-19 22:06:12 · 1626 阅读 · 0 评论 -
Codeforces Round #343 (Div. 2) D. Babaei and Birthday Cake(线段树+离散化优化DP)
题目链接:点击打开链接题意:给出n个圆柱体的地面半径和高, 要求只能有一个直接放在桌子上, 其他的要放在他上面, 第i个能放在第j个上面的条件是:当且仅当第i个的体积大于第j个且j 思路:一看就是一个DP, 而且状态很容易表示, d[i]表示到第i个为止能得到的最大总体积。 转移到 max(d[j]) + a[i], (j a[j])。 但是n非常大, 显然要优化, 因为第二层循环原创 2016-02-21 14:27:34 · 1591 阅读 · 0 评论 -
Codeforces Round #343 (Div. 2) (C. Famil Door and Brackets(DP))
题目链接:点击打开链接题意:给你一个长度为m的只含()的括号串s, 要求在s两端在加两个串p和q, 使得总长度为n,并且平衡, 平衡是指任意前缀串的(都不少于), 并且整个串的(和)一样多。思路:我们不难想到这样一个DP, d[i][j]表示长度为i的串,(比)多j个(或者)比(多j个, 是等价的)的方案数。 那么转移很简单:if(j > 0) d[i][j] += d[i-1][j原创 2016-02-23 17:27:11 · 1306 阅读 · 1 评论 -
HDU 4489 The King’s Ups and Downs(DP + 组合数)
题目链接:点击打开链接思路:我们不妨把n个人的身高设为1~n, 然后从低到高插入队列。 那么将第i个人插入队列的时候就出现了问题, 插入的这个位置需要满足前面两个是高低, 后面两个是低高。所以我们用DP来记录。 用d[i][0] 表示i个人的队列, 结尾为高低的方法数, d[i][1]表示开头为低高的方法数。 那么假设将第i个人插入, 插入的位置前面有j个人, 后面有i - 1 - j个原创 2016-04-11 16:44:28 · 1745 阅读 · 1 评论 -
HDU 4248 A Famous Stone Collector(DP + 组合数)
题目链接:点击打开链接思路:DP + 组合数。 用d[i][j]表示前第i种颜色的石头, 已经用了j个的方法数, 每次枚举第i种石头放多少个, 假设放k个, 那么相当于从j个位置中选k个, 预处理组合数就行了。细节参见代码:#include#include#include#include#include#include#include#include#include#原创 2016-04-20 21:37:12 · 1440 阅读 · 0 评论 -
Codeforces Round #341 (Div. 2) E. Wet Shark and Blocks(矩阵优化DP)
题目链接:点击打开链接题意:给n个数作为一个块,有b个块,从其中若干个中选择数,每个块只能选一个数,最后组成一个数模x等于k的方法数。思路:很容易想到这样一个DP方程 : 用dp[i][j]表示现在i位,余数是j。那么dp[i + 1][(j * 10 + k) % x] = dp[i][j] * cnt[k],k是指枚举放1~9中哪一位。因为b特别大,显然要矩阵优化,知道了DP方程,原创 2016-02-01 14:45:46 · 1305 阅读 · 0 评论 -
HDU 5617 Jam's maze(DP)
题目链接:点击打开链接题意:给你一个n*n的矩阵。 求从(1,1)走到(n,n)所组成的回文串个数。思路:一开始傻逼把状态写成了d[x][y][s],s表示一个串, 用map存的, 后来发现极不可行, 因为这个状态简直太大了, 包括了s串的所有情况。 只是相当于一个dfs中的剪枝罢了。后来想到, 其实串是不必记录的, 我们只要统计个数, 所以不妨在DP的过程中就判断回文串的情况, 那原创 2016-01-31 17:06:55 · 1547 阅读 · 0 评论 -
POJ 3666 Making the Grade(DP)
题目链接:点击打开链接题意:给n个数, 要求把这个数列变成非减或者非增数列, 求最小该变量之和。思路:原创 2016-02-12 19:56:16 · 2685 阅读 · 0 评论 -
HDU 3450 Counting Sequences(DP + 树状数组)
题目链接:点击打开链接题目大意: 统计满足相邻两个数之差不超过d的子序列个数。我们不难想到一个O(n^2)的DP算法 : 对于每一个i, d[i]表示 以i结尾的子序列个数。 那么它将转移到所有满足(j >= 1 && j 但是由于n太大了, 这样显然会超时, 那么我们来想想如何优化这个算法: 可以发现, 对于每个d[i], 其累加的部分是一个(a[i] - d, a[i] +原创 2015-12-22 20:36:58 · 1050 阅读 · 0 评论 -
Codeforces Round #271 (Div. 2) E. Pillars(线段树优化DP)
题目链接:点击打开链接题意:一个n个数的序列,每个数有一个高度值h[i]。 求一个最长子序列,要求相邻两个数满足| h[i] - h[i-1] | >= d。 并要求打印出该序列。类似于最长上升子序列, DP思想很简单, 但是可惜n太大了, 二重循环会超时。 所以要想办法优化掉第二层循环。观察发现, 第二层所做的事情就是在所有满足j= d 的j中找到最大的d[j]。j 把不等式原创 2016-01-25 17:50:00 · 1310 阅读 · 0 评论 -
HDU 5623 KK's Number(DP)
题目链接:点击打开链接题意:两个人轮番从n个数中每次选择任意个数, 每次获得的分数是所选数种最小的,两人采取的策略都是使得自己的分数减去对方的分数尽量大, 求最终第一个人的得分。思路:昨天BC的C题, 因为每次可以选择若干个数, 所以普通的贪心肯定是不行的。 我们可以用d[i]表示还剩i个数时先手减去后手得分的最大值, 这样的话, 每次转移是:d[i] = max(a[j+1] - d原创 2016-02-07 14:32:53 · 2407 阅读 · 0 评论 -
HDU 4433 locker(DP)( UVA 1631 - Locker)
题目链接:点击打开链接题意:有一个n位密码锁,每一位都是0~9,可以循环旋转,每次可以让1~3个相邻数字同时往上或者往下旋转一格。 输入初始状态和终止状态,问最少需要转几次。思路: 很显然是个DP题目, 由于每次可以让相邻的1~3个数字同时旋转, 所以状态的表示上就要考虑相邻3个位置。那么可以用d[i][a][b][c]表示当前到了第i位,第i位上当前是a,i+1位是b,i+2位是c。原创 2016-01-29 13:32:45 · 1705 阅读 · 0 评论 -
POJ 3734 Blocks(矩阵优化+DP)
题目链接:点击打开链接题意:个n个方块涂色, 只能涂红黄蓝绿四种颜色,求最终红色和绿色都为偶数的方案数。该题我们可以想到一个递推式 。 设a[i]表示到第i个方块为止红绿是偶数的方案数, b[i]为红绿恰有一个是偶数的方案数, c[i]表示红绿都是奇数的方案数。那么有如下递推可能:递推a[i+1]:1.到第i个为止都是偶数,且第i+1个染成蓝或黄;2.到第i个为止红绿恰有一个是原创 2016-01-12 18:35:46 · 1871 阅读 · 0 评论 -
Manthan, Codefest 16 (C. Spy Syndrome 2 (trie树 + DP))
题目链接:点击打开链接题意:给你一个m个单词的字典, 给你一句话, 这句话中的每个单词都来自字典, 字典中的每一个单词可重复使用, 把这句话的所有大写字母变成小写字母, 然后反转后去掉空格。 要求你恢复这句话。思路:一看就是一个典型的DP, 很容易想到, 枚举每个单词的起点, 然后向后找这个单词的终点, 并转移过去。 但是问题在于, n和m都很大, n*1000复杂度如果再用map查找原创 2016-03-01 15:46:08 · 1201 阅读 · 0 评论 -
UVA 10917 - Walk Through the Forest(最短路优化DP)
题目链接:点击打开链接题意:给你一个图, 从1走到2,求有多少种不同的走法,从结点a可以走到b的条件是:存在一条总b出发回家的路径,比从a出发回家的路径都短。思路:这个条件的意思其实就等价于从2到b的最短路比从2到a的最短路短。所以, 可以事先处理出从2出发到所有结点的最短路。 然后用DP进行计数就行了。细节参见代码:#include#include#include#in原创 2016-02-11 13:34:49 · 2330 阅读 · 0 评论 -
HDU 5607 graph(矩阵优化+概率DP)
该题很容易想到求概率的转移方程:用d[i][j]表示第i原创 2016-01-13 11:55:35 · 1348 阅读 · 0 评论 -
UVA 11324 - The Largest Clique(SCC缩点 + DP)
题目链接:点击打开链接思路:如果没有环, 该题就是DAG上最长路, 现在有环, 我们把强连通分量缩点, 那么缩点之后的图就是一个DAG, 可以用DP求解, 用d[i]表示以i结尾的最长路距离。细节参见代码:#include #include #include #include #include #include #include #include #include #原创 2016-05-18 22:09:31 · 2902 阅读 · 0 评论 -
LA 3637 - The Bookcase(DP)
题目链接:点击打开链接思路:用d[i][j][k]表示前i个, 已经占据了第一层j厚度,第二层k厚度的最小高度。 转移即可。 这题卡常数挺恶心的, 要加点恶心的优化。细节参见代码:#include #include #include #include #include #include #include #include #include #include #inc原创 2016-06-09 14:10:22 · 2313 阅读 · 0 评论 -
Codeforces Round #358 (Div. 2) D. Alyona and Strings(DP)
题目链接:点击打开链接思路:类似于LCS, 只需用d[i][j][k][p]表示当前到了s1[i]和s2[j], 形成了k个子序列, 当前是否和上一个字符和上一个字符相连形成一个序列的最长序列和。细节参见代码:#include #include #include #include #include #include #include #include #includ原创 2016-07-09 22:03:07 · 1292 阅读 · 0 评论 -
POJ 3538 Domestic Networks(DP)
题目链接:点击打开链接思路:选一些边, 使得任意两点都可以相互到达且花费最小, 这显然是最小生成树, 将边挑选出来之后, 如果贪心选取的话, 有可能导致无解, 所以我们考虑用动态规划。根据数据量, 用d[i][j]表示前i个边, 第一种颜料用了j单位长度下的最小花费, 因为没条边都选, 那么用总和减去j就是第二种颜料的花费。 用path[i][j]表示改状态下从哪一个状态转移过来原创 2016-10-03 16:33:09 · 999 阅读 · 2 评论 -
POJ 3373 Changing Digits(DP)
题目链接:点击打开链接思路:用d[i][j]表示前i位余数为j的最小修改次数, DP的过程中用path[i][j]表示相同状态下的下一个余数, 目的是记录路径, 用hehe[i][j]表示相同状态下该位最终的值是多少。细节参见代码:#include #include #include #include #include #include #include #inclu原创 2016-10-17 22:12:02 · 698 阅读 · 0 评论 -
UESTC - 1251 谕神的密码(DP)
题目链接:点击打开链接思路:根据数据范围, 很容易确定用d[i][j]表示前i位和为j是否能组成符合要求的数字。 用path[i][j]表示下一个状态的j值, hehe[i][j]表示当前状态选了哪个数字。特判n == 1 && s == 0。细节参见代码:#include #include #include #include #include #include #原创 2016-10-19 20:28:18 · 621 阅读 · 0 评论 -
HDU 5945 Fxx and game(DP+单调队列)
题目链接:点击打开链接思路:用d[i]表示从i变到1的最小花费, 那么如果i % k == 0, 转移到d[i/k], 还可以转移到min(d[i-t, i]), 我们可以发现这是一个区间最小值, 用线段树维护即可, 但是该题时间卡的很严, 线段树会TLE, 那么我们还可以用单调队列搞一搞。复杂度O(n)。细节参见代码:#include #include #include原创 2016-11-01 16:09:29 · 675 阅读 · 0 评论 -
Codeforces Round #383 (Div. 2) D. Arpa's weak amphitheater and Mehrdad's valuable Hoses(DP)
题目链接:点击打开链接思路:在宿舍打CF不敢使劲敲键盘, 最后没交上D也怨不了别人。 挺水的DP, 就是个背包。细节参见代码:#include #include #include #include #include #include #include #include #include #include #include #include #include原创 2016-12-07 11:23:37 · 599 阅读 · 0 评论 -
Codeforces Round #384 (Div. 2)D. Chloe and pleasant prizes(树DP)
题目链接:点击打开链接思路:比较简单的树DP, 用dp[u][id]表示当前以u为根的子树还已经找到几个子树的最大值。 转移比较多, 一方面可以转移到某一个儿子, 表示问题在以后解决, 一方面如果id==1说明还要找1个子树,可以直接用val[u]更新, val[u]表示该子树的和。 如果id == 0说明还要找两个子树, 我们用两个最大的儿子值更新即可。细节参见代码:#in原创 2016-12-19 20:20:09 · 873 阅读 · 0 评论 -
Codeforces Good Bye 2016(部分题解)
本次比赛一共AC了前4题...A. New Year and Hurry水题。#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #incl原创 2016-12-31 19:29:48 · 902 阅读 · 0 评论 -
HackerRank Even Tree(树dp)
题目链接:点击打开链接思路:简单证明了一下,贪心不可行, 那么我们考虑树形dp。 用d[u]表示以u为根的子树的最优解。 u的儿子v,如果以v为根的子树数目为偶数, 那么可以考虑选择断掉u和v的边(决策1), 也可以不断, 递归下去(决策2)。细节参见代码:#include #include #include #include #include #include原创 2017-01-26 16:18:29 · 750 阅读 · 0 评论 -
Vijos P1987 游戏(DP)
题目链接:点击打开链接思路:类似背包, 很容易想到用d[i][j][s]表示前i个数字选了j个和为s的情况是否存在, 复杂度略高, 考虑到这是个布尔类型, 可以用bitset转移, 复杂度/6, 这样就可以过掉全部数据了。细节参见代码:#include #include #include #include #include #include #include #inc原创 2016-11-03 17:25:29 · 639 阅读 · 1 评论 -
ZOJ 3216 Compositions(矩阵优化DP)
题目链接:点击打开链接思路:ZOJ挂了, 理论AC一下。用d[i]表示数i的拆分方案。 转移是个难点, 我们可以考虑转移到d[i-1]表示对于当前这个拆分出的数进行+1修改, 转移到d[i-k]表示之前拆分的数不变了, 新增加一个拆分数k。然后构造矩阵就很简单了。原创 2016-10-21 20:27:46 · 798 阅读 · 0 评论 -
UVAlive 6697 - Homework Evaluation(DP)
题目链接:点击打开链接思路:用d[i][j][last][p]表示第一个串到了i位置, 第二个串到了j位置,上一个操作是last操作, 是否开始匹配的最优解。该题有坑的, 比赛时多亏队友的提示: 当第一个串匹配完毕, 第二个串剩下的部分要当作减去了。细节参见代码:#include #include #include #include #include #includ原创 2016-08-23 20:54:33 · 639 阅读 · 0 评论 -
Codeforces Round #271 (Div. 2) E. Pillars(线段树+DP)
题目链接:点击打开链接思路:类似于最长上升子序列, 我们很容易得到一个n^2的算法, 但是时间复杂度无法承受。可以发现, |a[i]-a[j]| >= d相当于对于每个j, 找到一个i = a[j]+d)中最大的dp[i]。 我们将数字大小离散化之后做线段树下标, 然后维护一个区间最大值就行了。 时间复杂度O(nlogn)细节参见代码:#includeusing namesp原创 2016-07-13 14:03:57 · 554 阅读 · 0 评论 -
Codeforces Round #360 (Div. 1) C. The Values You Can Make(DP)
题目链接:点击打开链接思路:用d[i][j][k]表示, 前i个数, 选取的数之和为j, 再次选取的数之和为k的种类数。 那么当这种情况存在时, 我们把此时的k保存即可。细节参见代码:#include #include #include #include #include #include #include #include #include #include原创 2016-07-06 15:30:44 · 1483 阅读 · 0 评论 -
HDU 5773 The All-purpose Zero(DP)
题目链接:点击打开链接思路:首先一点:我们把所有0都用上是肯定不亏的。接下来:我们把剩下的非0数求LIS, 但是, 这些0有可能不能全部插入LIS中, 那么势必要在LIS中剔出一些数。 一个很简单的方法, 我们把每一个数减去他前面的0的个数, 这样, 相当于先为0留出了空间, 因为是全都减小, 相对大小是不变的。细节参见代码:#include #include #inclu原创 2016-07-28 21:30:51 · 1492 阅读 · 1 评论 -
HDU 3689 Infinite monkey theorem(KMP + DP)
题目链接:点击打开链接思路:用d[i][j]表示前i个字符,已经匹配了字母中的j个字符,最终包含这个字母的概率。每次转移的时候有n个方向, 表示第i个字符选哪个字符, 那么有个问题, 如果我当前选的这个字符失配了, 那么转移之后我还匹配了多少个字符。 这恰恰是KMP能做的。细节参见代码:#include #include #include #include #inclu原创 2016-08-03 20:02:09 · 655 阅读 · 0 评论 -
Codeforces Round #363 (Div. 2)题解
这场比赛水了4个题。 部分题解如下:A. Launch of ColliderA题:我们每次遇到一个L, 就找到上一个R,他们肯定是比较近的, 这些中最近的就是最近的辣。细节参见代码:#include #include #include #include #include #include #include #include #include #inclu原创 2016-07-20 20:49:59 · 1472 阅读 · 0 评论 -
HDU 3237 Help Bubu(DP)
题目链接:点击打开链接思路:比赛时查一点出, 需要加一个优化才能防止超时(恶心), 状态很容易想到: d[i][j][s][k]表示前i本书拿了j本没拿的书的集合是s没拿的书的最后一本是k的最优解。为什么状态压缩的是目前桌子上的书的集合呢? 因为我们要防止一种情况:那就是如果对于高度为H的一种书, 我们都拿走了, 那么还要放回桌子上, 最优解要+1, 这样表示之后, 我们只要判断一下原创 2016-08-05 21:59:52 · 882 阅读 · 0 评论