DP
文章平均质量分 63
HouseFangFZC
oo
展开
-
LeetCode 70 Climbing Stairs
题意:每次迈步可以跨越1或2个台阶,问爬n阶台阶的方案有几种。思路:简单的dp题,dp[i]表示爬n阶台阶的方案数,则dp[i] = dp[i - 1] + dp[i - 2]。而且为了优化空间,dp数组可以滚动。代码:class Solution {public: int climbStairs(int n) { int dp[3];原创 2017-10-26 15:05:00 · 304 阅读 · 0 评论 -
Codeforces Round #274 (Div. 2)
昨天打了场div2 成绩不错AK了 希望以后还能有5:00的比赛…479A Expression 给你3个数字 不让换顺序 中间填+或*使结果最大 把情况写出来就好了…#include#include#include#include#include#include#include#include#include#include#include#i原创 2014-10-20 09:05:29 · 1206 阅读 · 0 评论 -
CodeForces 484D Kindergarten
题意:将含有n(10^6)个元素的序列a划分成几段 每段为连续的一些元素 每段的价值为段中最大值减去最小值 总价值为所有段的价值和 求 最大的总价值思路:不难想到一个dp的转移方程 dp[i] = max( dp[j] + max(a[j+1]...a[i]) - min(a[j+1]...a[i]) ) 但是dp是n^2的会TLE注意观察转移方程 其中的max-mi原创 2014-11-20 13:38:11 · 872 阅读 · 0 评论 -
HDU 3831 DICS
题意:通过题中给出的4种操作 用最少的次数 从a串变换到b串思路:由于操作只有这4种 所以我们可以确定从头到位去匹配a和b一定是正确的那么状态数一共有多少呢 一共有length[a]*length[b]*(1+num(a~z)+num(A~Z)) 状态不多 可以用dp解决上述计算状态可以表示为dp[i][j][k] 即a串匹配到i同时b串匹配到j k表示修改后缀原创 2014-10-05 09:54:15 · 1168 阅读 · 0 评论 -
CodeForces 482C Game with Strings
题意:n个长为m的字符串 等概率的藏起来一个串 然后游戏者来猜藏起来的串是什么 每一步游戏者可以等概率的询问字符串的一个位置 再不断的知道一些位置后 游戏者就可以确定藏起来的串是什么 问 游戏者的期望步数思路:可以说是一道概率题 也可以说是期望题 总之感觉题目不错…首先如果我们枚举藏起来的串是哪个(复杂度n) 然后利用状压去dp维护猜某些位的状态的概率 以及对原创 2014-10-31 18:40:25 · 1991 阅读 · 2 评论 -
ZOJ 3822 Domination
题意:一个棋盘如果每行每列都有棋子那么这个棋盘达到目标状态 现在随机放棋子 问达到目标状态的期望步数思路:用概率来做 计算第k步达到目标状态的概率 进而求期望 概率计算方法就是dp dp[k][i][j]表示第k步有i行被覆盖j列被覆盖 转移只有4种 —— 同时覆盖行列 覆盖行 覆盖列 不覆盖 状态数50^4 很简单代码:#include#inclu原创 2014-10-14 15:16:31 · 1082 阅读 · 0 评论 -
ACdream Andrew Stankevich's Contest(1)
国庆打了场组队 效果还不错 季军 现在发下题解A:高精度模拟即可 与n互素的数不会离n/2太远 直接暴力代码:#include#include#include#includeusing namespace std; //compare比较函数:相等返回0,大于返回1,小于返回-1int compare(string str1, string str2) {原创 2014-10-01 18:11:18 · 1628 阅读 · 0 评论 -
HDU 4169 Wealthy Family
题意:n个节点的树 每个节点上有个价值 要求选出k个两两互相没有祖孙关系的节点 使得价值和最大思路:明显的树形dp 如果用dp[fa][i]表示fa子树取i个点的最大价值和 则有转移 dp[fa][i]=max(dp[son][k]+dp[fa][i-k])但是如果这样开数组会MLE 所以本题猥琐的使用dfs内部开数组的方式 这样借助全局变量的帮助 我们可以避免M原创 2014-10-25 21:30:41 · 981 阅读 · 0 评论 -
ZOJ 3812 We Need Medicine
题意:一个物品重w效力t 给出所有n个物品 有q个询问 每个询问输出w的和为m同时t的和为s的方案思路:明显就是01背包 只不过一个东西在两个维度上有价值 由于w只有50因此可以状压先想如何输出方案 利用f[i][j]表示sumw=i同时sumt=j时候装进包里的最后一个物品 那么输出这个物品后i和j都减去这个物品的w和t 就可以到达新的状态 这样可以一直到背包为原创 2014-09-16 18:58:44 · 1051 阅读 · 0 评论 -
HDU 4916 Count on the path
题意:给定一棵树和m个询问 每个询问要求回答不在u和v两节点所形成的路径上的点的最小标号思路:一开始以为是LCA… 不过T了好几次… 后来发现不用LCA也可做考虑每个询问u和v 如果他们的lca不是1 则1一定是答案 不过求lca会T 那么我们只需要在遍历树的时候给节点染色 染的颜色就是1的儿子的颜色 如果x这个点在y的子树中(y是1的儿子)那么他的颜色就是y原创 2014-08-09 19:41:25 · 1608 阅读 · 0 评论 -
CodeForces 487B Strip
题意:n(10^5)个人分组 每组最少L个人 每组的差异为组中人最大价值-最小价值 要求差异均不超过S 问最少分几组思路:假设已经知道组的区间[l,r]那么计算差异就是简单的rmq问题 可以用线段树搞我们可以用dp[i]表示到i位置产生的最少组数假设从i位置开始分一组 会影响到哪些dp呢 我们可以利用二分+rmq找到这个组最远延伸到哪里 从L到最远点这个区间的d原创 2014-11-26 11:36:08 · 1867 阅读 · 0 评论 -
CodeForces 486E LIS of Sequence
题意:n(10^5)个数字的序列a 求每个位置i 它是不出现在任何LIS中 还是 出现在一些LIS中 还是 出现在所有LIS中思路:比赛时候唯一没做出的题… 赛后还是不会做… - -b 看了别人的代码觉得好精妙!!首先以O(nlogn)复杂度求出LIS然后我们倒序扫描序列a 对于位置i 如果lis[i]=LIS或者a[i]<big[lis[i]+1] (big[x]表示lis=x的a的最大值 这里的意思是 如果a[i]是某个LIS的最后一个 或者 能与某个LI原创 2014-11-21 21:29:15 · 1056 阅读 · 0 评论 -
CodeForces 490F Treeland Tour
题意:一棵树 对于原创 2014-11-24 10:48:36 · 1418 阅读 · 2 评论 -
LeetCode 64 Minimum Path Sum
题意:在数字矩阵中,每次行动向下或向右走一格,问从左上角到右下角的路径中数字和最小的是多少。思路:和 http://blog.csdn.net/houserabbit/article/details/72822932 的dp几乎一致,用dp[i][j]表示第i行第j列的路径和,则转移方程为 dp[i][j] = grid[i][j] + min (dp[i - 1][j], d原创 2017-05-31 19:16:03 · 342 阅读 · 0 评论 -
LeetCode 63 Unique Paths II
题意:给出一个带有障碍物的棋盘,每次行动向下或向右移动一格,求从左上角到右下角有几种方案。思路:简单dp题,假设dp[i][j]表示第i行第j列的方案数,那么状态转移方程就为 dp[i][j] = dp[i - 1][j] + dp[i][j - 1] 。注意下边界条件就好了,而且对于障碍物,直接把dp清零即可。可以发现这个dp只和当前行和上一行有关,进而做空间优化,用原创 2017-05-31 19:09:38 · 330 阅读 · 0 评论 -
LeetCode 60 Permutation Sequence
题意:输入数字n和k,n表示给出数组[1, 2, 3, 4 ... n],输出这个数组的第k个排列。思路:这种题目和“使用一些数字,找出它们能组成的第k小的数字”是一样的,很典型的数位dp问题。假设我们已经确定了前i - 1位,现在确定第i位的数字是什么,也就是说现在要用剩下的n - i + 1个数字的第x个排列(x那么我们可以将剩下的数字从大到小枚举,如果第i位填x,原创 2017-05-26 11:13:19 · 381 阅读 · 0 评论 -
LeetCode 53 Maximum Subarray
题意:给出一个数字数组,求其中和最大的子串。思路:经典的dp题。对于一个数字,要么把它合并到了之前开始的某个串中,要么从它开始一段新的串。所以,用dp[i]表示包含第i个数字的最大子串和,则dp[i] = max(dp[i -1] + nums[i], nums[i])。换一种想法,如果某个串的和是正数那么它继续增长才是有意义的。所以,可以维护一个子串和,如果子串和为正原创 2017-05-26 09:27:53 · 273 阅读 · 0 评论 -
LeetCode 44 Wildcard Matching
题意:给出一个字符串s和一个模式串p,p中的"?"表示任意单个字符,"*"表示任意字符串(可以是空串),问s和p是否匹配。思路:不同于 http://blog.csdn.net/houserabbit/article/details/54288851 这道题但是很相似,搜索效率低,所以用dp。dp[i][j]表示p串i位置之前与s串j位置之前是否匹配,状态转移方程即:p原创 2017-05-25 17:14:07 · 292 阅读 · 0 评论 -
HDU 5148 Cities
题意:n(2000)个点的树 从中选出k(50)个点 要求 选出的点中等概率选出两个点 使得这两点的期望值最小 输出期望值乘k^2思路:我们将题目的要求化简 sum( sum( dis(i,j) ) ) / k^2 * k^2 其实就是求 sum( sum( dis(i,j) ) ) 其中i和j为任意选出的k个点设dp[i][k]表示扫描完i为根的子树选出k个点原创 2014-12-21 19:01:16 · 827 阅读 · 0 评论 -
Codeforces 508E Arthur and Brackets
题意:给出括号序列中每个右括号可能离对应左括号多远 求这个括号序列思路:记忆化搜索解决 用f[l][r]表示对于第l个左括号到第r个左括号区间最前面的左括号与其对应右括号的距离状态只有n^2个 不用担心TLE求f[l][r]的方法为 如果最前的左括号可以包住l+1~r个括号就尝试包起来 否则将l~r分治为l~x和x+1~r两个子问题代码:#include#i原创 2015-01-29 13:34:48 · 1179 阅读 · 0 评论 -
CodeForces 489F Special Matrices
题意:n(500)*n的矩阵 每行每列只有两个1 现在给出前m行 问 有几种合法的矩阵思路:只需要考虑每列上有几个1 然后按行扫描 每次维护行内只有2个1 这样就能构造出合法矩阵那么我们定义dp[i][j][k]表示扫描到第i行有j列是包含1个1的有k列是包含2个1的 这时500^3数组开不下 于是滚动i那么对于dp[i][j][k]如果n-j-k>=2原创 2014-12-03 13:02:18 · 1145 阅读 · 0 评论 -
CodeForces 486D Valid Sets
题意:给定一棵n(2000)个节点的树 每个节点上有个数字 问 有多少棵子树满足树中最大数字与最小数字的差不超过d思路:根据数据猜复杂度可能为n^2 想到尝试树形dp假如枚举现在树中的最大值 那么最小值可以求出 这时不在数值范围内的节点都可以标记掉那么假设这个最大值的点我一定选取 那么就可以dp出一定选这个点的情况下子树的种类数假设u是父节点 v是子节点原创 2014-11-21 21:22:05 · 954 阅读 · 0 评论 -
HDU 5000 Clone
题意:每个克隆个体有n个属性 如果对于A、B两个个体 A的n个属性均不低于B的n个属性 那么B会被淘汰 问最多能有多少个体同时存活思路:根据数据大小猜一下是n^2的复杂度 往DP方面考虑一下DP需要一个想法的支持 就是最优的那个集合中的元素的n个属性的和一定是一样的 为什么呢? 想象一下 假设最优的集合的属性和是5 这时你选过来一个和为6或者4的元素 那么至少原创 2014-09-18 09:23:44 · 1370 阅读 · 1 评论 -
HDU 4917 Permutation
题意:一个序列p1、p2、p3……pn是由1、2、3……n这些数字组成的 现给出一些条件pi思路:很容易想到用一条有向的线连接所有的pi和pj 那么就构成了有向无环图(题中说有解所以无环)又因为pi各不相同 那么题目就变成了有向无环图的拓扑排序的种类数题目中边数较少 所以可能出现不连通情况 我们先讨论一个连通集合内拓扑排序的种类数题目中m较小 可以利用状原创 2014-08-08 10:05:00 · 1452 阅读 · 0 评论 -
HDU 5001 Walk
题意:连通无向图 随机选起点 随机乱走 可以重复走点 问 每个点有多大几率不被路过思路:一看就是DP题…但是开始的时候陷入了僵局 我是想先算路过每个点的概率然后用1减去这个概率 但是由于可以重复路过 所以无法判断是不是第一次经过这个点所以我们应该直接做不路过的概率 即类似bfs的一步步走 如果走到了要计算的点就停下来 意思就是除了要计算概率的那个点不能原创 2014-09-18 16:34:57 · 868 阅读 · 0 评论 -
CodeForces 402D Upgrading Array
题意:一些坏的素数b 一串数字a 每次操作可以使a中前r个数字除以它们的gcd 操作次数不限 这串数字a有个得分 得分为每个数字中好素数个数减去坏素数个数 问 如何使a得分最大思路:以为每次操作都是对前r个数字除以gcd 自然想到从前到后扫描一遍用dp维护gcd为了更贴近这道题我打了素数表 dp维护gcd即维护gcd中有几个相应的素数(相当于把gcd素数分原创 2014-03-20 11:01:11 · 801 阅读 · 0 评论 -
CodeForces 401D Roman and Numbers
题意:将n的各位数字重新排列(不允许有前导零) 求 可以构造几个%m等于0的数字思路:dp题 由于最多只有18个数字所以可以用二进制表示 dp[i][j]表示使用了i(二进制)表示的数字%m等于j的个数状态转移 dp[i][ (k*10 + dig[j]) %y ]+=dp[ i ^ (1注意去重 如果一个数字有x个 那么对于这个数字就产生了x!的重复原创 2014-03-19 10:20:22 · 909 阅读 · 0 评论 -
CodeForces 404D Minesweeper 1D
题意:一个字符串 ?可以被替换 *表示雷 数字表示旁边雷的个数 (就是扫雷游戏…) 问 这个串有几种可能的结构思路:画出所有转移dp就好了 画的思路就是当前位置是什么符号 它前面是什么符号或符号组合确定了前面的东西后 是不是也对后一位有要求(比如01后面一个必须是*)代码:#include#include#includeusing原创 2014-03-27 20:28:24 · 1074 阅读 · 0 评论 -
USACO Section 3.3 A Game
题意:一串数字两个人轮流拿头或尾上的一个数字 求两个人都按最优情况行动最后得分分别是多少思路:非常经典的dp一定要会!!dp[i][j]表示当前拿数字的人在[i,j]区间内能得到的最大得分状态转移 dp[i][j] = sum[j] - sum[i-1] - min( dp[i+1][j] , dp[i][j-1] )理解一下就是[i,j]区间的数字除去别人拿的原创 2014-02-17 21:58:17 · 713 阅读 · 0 评论 -
USACO Section 3.3 Home on the Range
题意:边长为n的正方形棋盘内有一些坏的点 求出边长为k(n>=k>=2)的内部不含坏点的正方形有几个思路:本以为用二维树状数组可以搞定 可是准确算一下复杂度为O( n^3 * log2(n)^2 ) 还是TLE了正确思路应该是dp 求出每个点左边和上面距离坏点的距离 O( n^2 )再枚举每个点当小正方形的右下角的点 然后判断是否能构成边长为k的正方形 O(原创 2014-02-17 18:50:46 · 665 阅读 · 0 评论 -
HDU 2196
题意:求树上每个点能走出的最远距离思路:树形DP第一次dfs求出u点向子树方向走的最长路(dis1)和次长路(dis2)状态转移 tmp[u] = edge + dis1[v]第二次dfs求出u点向父亲方向走的最长路状态转移 tmp[u] = edge + ( u == fa1[f] ) ? dis2[f] : dis1[f]代码:#incl原创 2014-02-15 20:52:20 · 1115 阅读 · 0 评论 -
USACO Section 3.2 Stringsobits
题意:N位二进制数1的个数不超过L个 求 第i个数是多少思路:一开始以为是用二进制暴力就行 事实证明我是213 - -b这题就应该去构造 但是简单的用dfs构造然后计数还是会TLE 因此想到去组合假如现在想求第k位是0还是1 可用的所有的1全在1~k-1位的种类数为x 如果x如此就可以先dp打一个杨辉三角的组合数表 然后根据不同位置形成的种类数判断0原创 2014-01-29 17:51:25 · 719 阅读 · 0 评论 -
CodeForces 385D Bear and Floodlight
题意:从坐标(L,0)到坐标(R,0)直线行走 走过的地方必须被N盏灯里的至少1盏照亮 每盏灯有一个位置坐标 照亮方向任意且可照亮无限远 但只有一个固定的照明角度 求最远走多远思路:灯的数量只有20 这是突破口 可以状态压缩 用dp[i]表示i状态时走的距离 i的二进制形式中1表示对应灯亮那么最后答案就是dp[(1i) )实现时用bfs维护dp就好原创 2014-01-28 12:58:58 · 1110 阅读 · 0 评论 -
USACO Section 2.3 Cow Pedigrees
题意:N个节点 深度为K 的正则二叉树 求 树有几种形态思路:一开始以为是数学题… 看了byvoid的题解才知道是dp…每棵树由根节点、左子树、右子树构成 由此得状态转移 树=左子树*右子树节点数和深度是影响答案的属性 所以令dp[i][j]表示i个节点深度在j以内的树的形态数深度在j以内的树又两个深度在j-1以内的树和一个根节点构成设左子树k个原创 2014-01-23 11:28:14 · 668 阅读 · 0 评论 -
CodeForces 407B Long Path
题意:有n+1个格子 起点在1 每个格子有个前进1的门 前n个格子有个返回的门(返回前面某个格子) 奇数次走进一个格子就去走返回门 偶数次走前进门 问 走到n+1要走过几道门思路:一看就是DPto[i]表示第i个格子的返回门go[i]表示离开第i个格子需要的步数sum[i]表示离开前i个格子需要的步数明显 go[i]=sum[i-1]-sum[t原创 2014-03-31 20:47:56 · 1084 阅读 · 0 评论 -
最长单调子序列种类数
思路:求原创 2014-05-07 20:09:22 · 760 阅读 · 0 评论 -
CodeForces 425C Sereja and Two Sequences
题意:两组数字a和b 如果a[i]等于b[j] 则可将a[i]和b[j]前所有数字删掉 这种操作花费e体力 得到1元钱 或者一次删掉所有数字 这种操作花费等于曾经删除的所有数字个数 做完后得到所有钱 问 一共s体力 可以得到多少钱思路:dp+二分由数据可知最多拿到300元钱 因此可以定义 dp[i][j]表示有i元钱时 b串删除到了j处时 a串删到的位置状态转移为 dp[i][j] = lower_bound ( a[j] , dp[i-1][j-1] + 1 ) 意思原创 2014-07-17 19:47:09 · 1464 阅读 · 0 评论 -
2014多校训练九(HDU 4960 HDU 4961 HDU 4965 HDU 4968 HDU 4969 HDU 4970)
HDU 4960 Another OCD Patient题意:给你一串数字 相邻x个数字合并成一个数字(相加)有一定代价 问 最少花费多少使得串变成回文串思路:读完题感觉像dp 数据范围也像 就开始想怎么表示状态 最简单的应该想到dp[i][j]表示i到j区间变成回文串的最小花费 状态想好了想做法 考虑将串分成AAAABBBBBBBCCC三段 即所有A合成一个数字原创 2014-08-19 20:06:13 · 2150 阅读 · 2 评论 -
2014多校联合四(HDU 4901 HDU 4902 HDU 4905)
HDU 4901 The Romantic Hero题意: 一串数字a 找一个位置分开 前面为S'后面为T' 从这两个集合中分别选出子集S和T 使得S中元素的“异或”值等于T中元素的“且”值 问一共几种方案思路:由于a[i]只有1024 那么无论怎么运算都不可能大于2047 又因为S和T有一个明显的分界 所以我们可以想到利用dp分左右两边处理 令l[i][j]表示从左原创 2014-07-31 19:52:14 · 1534 阅读 · 6 评论 -
2014多校联合七(HDU 4937 HDU 4938 HDU 4939 HDU 4941)
好几天没写题解了… 都怪我太弱 补题补不动…HDU 4937 Lucky Number题意:一个数字如果只有3456这四种数字组成 那么这个数字是幸运的 问 给出一个x 它在几种进制下是幸运的 如果无穷输出-1思路:分类讨论 如果x是3或4或5或6 那么一定有无穷个进制满足(从十进制开始…) 直接输出-1除去上述情况 那么我们可以将一个数字写成这样 a0 +原创 2014-08-18 17:00:35 · 3191 阅读 · 0 评论