DP
文章平均质量分 67
iYUNDI
iYUNDI
展开
-
[DP_BASIC][LCS]Common Sequence
/*This Code is Submitted by Iris for Problem 1227 at 2013-07-26 10:41:29*///HOJ 1227 Common Subsequence//dp[i][j]represents first i elems and first j elems 's LCS#include #include #include using原创 2013-07-26 13:46:28 · 757 阅读 · 0 评论 -
[HDU 3652]B-number[数位DP]
题意:求1到N之间含有13且能被13整除的数的个数.思路:数位DP. 注意求"整除"条件需要记录余数,即模.#include #include using namespace std;int dp[12][15][2][12];int bit[12];//pos:处理的位数 num:模13余数 t:是否已有13 e:当前尾数 flag:是否进入上限范围int dfs(原创 2013-08-16 20:05:30 · 959 阅读 · 0 评论 -
[ural 1018]Binary Apple Tree[树DP]
题意:有棵苹果树,根节点编号为1.边权为该边上苹果数. 问保留x条树枝时, 能够保留的最多苹果数.思路:树DP.原创 2013-08-18 18:59:01 · 991 阅读 · 0 评论 -
[CF 279D]The Minimum Number of Variables[状压dp]
题意:很不好描述的题意...看了Hint再看Description才理解的.You've got a positive integer sequence a1, a2, ..., an. All numbers in the sequence are distinct. Let's fix the set of variables b1, b2, ..., bm. Initia原创 2013-10-02 16:47:08 · 1422 阅读 · 0 评论 -
[CF 279C]Ladder[segment]
题意:给出一列数,满足b1 ≤ b2 ≤ ... ≤ bx ≥ bx + 1 ≥ bx + 2... ≥ bk的子段为Ladder. 给出一系列询问, 判断该子段是否构成Ladder.思路:朴素地想:对于一个询问, 向右扫描,若一直不减, yes.若遇到第一个减少项, 则记录其前驱, 看此后是否一直不增. 若是, yes. 否则,no.这样的话 最多是O(n*m)的...1e10的数量级, 超时...注意到询问是动态的, 而数列是静态的. 可以预处理, 记录下数列的性质, 查询的时候直接调用原创 2013-10-02 11:16:21 · 1463 阅读 · 0 评论 -
[CF 148D]Bag of mice[概率DP]
题意:袋中有w白鼠,b黑鼠.A - princess B - dragonA,B轮流随机拿出一只, A先拿, B拿了一只之后会有一只鼠随机跑出.先拿到一只白鼠的获胜.问A获胜的概率.思路:概率DP.要义是记忆化搜索. 因为概率是一回合一回合累加的, 询问后面的概率时, 会用到前面的概率.dp记录的内容和问题有关, 这里只问A获胜的概率, 则dp[i][j]表示原创 2013-10-02 18:46:14 · 1184 阅读 · 0 评论 -
[CF 219D]Choosing Capital for Treeland[树形DP]
题意:给出n个点, n-1条有向边, 问从一个点出发到其他所有点时, 使得逆的边数最小的出发点, 以及逆的边数. 有多个出发点的话升序输出.思路:树形DP.这里DP的要义是一种递推, 只不过是沿着树的结构去递推.有一个关系需要发现: 当知道一个点到其他所有点需要逆的边的条数之后, 其他各点的结果可以通过递推求出:假设root有son1和son2, root到其他所有原创 2013-10-03 16:13:14 · 1253 阅读 · 0 评论 -
[poj 1699]Best Sequence[kmp][DP]
题意:n个串,构造出一个最短的串,使得这n个串每个串都是这个串的子串,输出的串的长度思路:1.预处理出一个串的前缀最多匹配多少长度的另一个串的后缀2.设dp[i][j]表示i状态的总串,最后一个子串为j时所构造的字符串的最短长度,每次枚举一个子串进行转移#include#include#include#include#include#includeusi原创 2013-10-04 10:12:41 · 1424 阅读 · 0 评论 -
[light oj 1032]Fast Bit Calculations[数位DP]
题意:求0到N范围内所有数中, 二进制形式中邻接"1"的对数.思路:数位DP.1. 记住数位DP就是要按位, 如果再一个一个数地增就不是数位DP了...2. 有明显层次性的, 一般要预处理.3. 按照状态去设置每一维的意义, 要为"可接续性"服务.(最高位为xx, 最低位为xx, 以xx结尾, 以x但不以xx结尾...之类的)这一题就是首先预处理出dp[i]原创 2013-10-04 15:59:23 · 1929 阅读 · 0 评论 -
[light oj 1018]Brush(IV)[状压DP]
题意:给出n个点, 求过这n个点所需的最少直线条数.思路:state表示点的状态,目的是求出对于某个state, 所需的最小直线条数.朴素地想state之间的转移情况, 记得要体现"半隐半显"的方法... 那就是枚举一个state中的任意一对点, 去掉这对点所在的直线经过的所有点, 得到state' , 答案就是ans[state] = min(ans[state], ans[原创 2013-10-04 20:08:01 · 1711 阅读 · 0 评论 -
[HDU 4433]locker[DP]
题意:给出密码做的现状和密码, 每次可以移动连续的最多3列, 向上或向下, 求将密码调出来所需要的最少步数.思路:首先应看出,恢复的过程中, 调每一位的时间顺序是不影响的, 不妨就从左到右一位位消除.dp[ i ][ x ][ y ] 表示前 i 位已经消除为0, 且其后的两位为x,y时, 所需要的最小操作数.每次可以旋转1~3位, 注意旋转3位时, 第三位和第二位的约束关系.原创 2013-10-06 13:50:01 · 1767 阅读 · 0 评论 -
[poj 2817]Wordstack[状压DP]
题意:给出N个串, 将其排列在N行上, 利用空格缩进, 使得每一行和上面一行的串重叠的部分最长. 求这个长度.思路:N最大为10, 考虑状压dp.state为串的状态, dp[state][ i ] 表示state状态下以第 i 个穿开头的方案中,重叠的最大长度. 则有:枚举state中的任意一个串 i 作为第一行, 另一个串 j 作为第二行, state' = state^(原创 2013-10-05 15:57:14 · 1514 阅读 · 0 评论 -
[poj 3254]Corn Fields[状压DP]
题意:一块玉米地,有的位置不能种草,种草的小方格不能有临边. 问有多少种方案.思路:状压DP.dp[ i ][ j ] 表示从上到下处理到第 i 行时, 该行状态为 j 的方案数.下一行某状态的方案数就是上一行所有合理状态的方案数之和.注意初始化和最后一行的处理.#include #include using namespace std;const int MAX原创 2013-08-16 20:11:28 · 877 阅读 · 0 评论 -
[HDU 4734]F(x)[数位DP]
题意:将一个十进制数n = dn dn-1 ... d0视为二进制. 即F(n) = dn*2^n + ... + d0*2^0.给出A, B. 求0 ... B之间, 该值不大于F(A)的数的个数.思路:数位DP.数位DP的优点在于, 你不需要知道这个答案是怎么来的, 只需要知道递推式. 这个答案的生成过程就在递推的过程中.dp [ i ] [原创 2013-09-14 19:42:11 · 2460 阅读 · 3 评论 -
[zoj 3551]Bloodsucker[概率DP]
题意:第0天有1个吸血鬼和n-1个人. 每天会有两个个体相遇. 异种, 则p的概率, 人变吸血鬼.问给定p时, 人全部变成吸血鬼的天数期望.思路:概率DP.求期望一般是倒着算. 加上组合数公式.#include #include using namespace std;const int MAXN = 1e5+5;double dp[MAXN],p;int n;原创 2013-08-16 20:20:19 · 973 阅读 · 0 评论 -
[HDU 4576]Robot[概率DP]
题意:环形cell, robot初始在1号,顺逆时针走概率各半.每次走w,问x次后停在l和r之间的概率.思路:正着推,方程很显然. 需要注意空间优化为2行, 时间上减少mod的次数.#include #include using namespace std;const int MAXM = 1e6+5;const int MAXN = 205;double dp[2原创 2013-08-16 19:42:59 · 1144 阅读 · 0 评论 -
[HDU 4336]Card Collection[状态压缩DP][概率DP][容斥原理]
题意:小吃中有N种卡片,每种卡片 i 出现的概率为 pi ,一袋小吃有可能没有卡片,但最多有一张.问集齐所有卡片需要购买小吃的袋数期望.思路:1.用状压dp,dp[ s ]表示在s状态时,集齐所需要的袋数期望.s = 11111表示N = 5时集齐的状态,此时dp[ s ] = 0;注意求期望的题,对于dp的定义一般都是从终态转移到初态,也就是反着求.因为"期望"是原创 2013-08-15 08:44:12 · 1356 阅读 · 0 评论 -
[DP_BASIC][LCS]Human Gene Functions
/*This Code is Submitted by Iris for Problem 1316 at 2013-07-26 12:19:13*/#include #include using namespace std;//这个问题用DP的话,需要考虑//dp[i][j]表示长为i,j时的最大相似度//dp[i][j] = max{dp[i-1][j-1]+cal[i][j],/原创 2013-07-26 14:48:59 · 660 阅读 · 0 评论 -
[LIS]Longest Increasing Sequence:nlogn算法和两种普通DP的实现
//最长单调上升子序列 nlogn算法#includeusing namespace std;#define MAXN 40002int a[MAXN],d[MAXN];int main(){ int n; cin>>n; for(int i=1; i<=n; i++) cin>>a[i]; in原创 2013-07-26 17:00:35 · 821 阅读 · 0 评论 -
[hoj]1485 A Good Helper[背包问题]
#include #include int f[1001];int max(int a,int b){ return (a>b?a:b);}void swap(int &a,int &b){ int c = a; a = b; b = c;}int main(){ int i,j,m,n,x,v[1001],big=1,total,tmp转载 2013-07-27 15:55:16 · 962 阅读 · 0 评论 -
[poj 1014]Dividing的DFS解法解读和DP解法
转载来源:http://blog.csdn.net/lyy289065406/article/details/6661449这道题比较特殊,用DFS也是对的,而且可以进行优化,即使直接n[i]--也是对的.解释见注释.//Memory Time //440K 16MS /*DFS*/ #include using namespace std;转载 2013-07-28 17:16:48 · 1214 阅读 · 0 评论 -
[poj 1742]Coins多重背包优化解法两则
用普通的多重背包会TLE.优化如下://这道题主要是由于cost 和 weight 是一样的,而且只问是否可以凑到该数.//将dp数组设为bool类型,只要可以达到,便记为1,否则为0.//初始条件是dp[0] = 1;表示0 dollars 总是可以凑出的~//转移方程是 dp[i] |= dp[i-A[i]];表示对于前i个面值的所有硬币,//总钱数i可以凑出的条件://原创 2013-07-29 00:27:16 · 765 阅读 · 0 评论 -
[HDU 3555]Bomb[数位DP]
因为是预处理,所以不代表是合法的数字,只是代表数字序列.计算结果时,最高位也是从0开始的.只有计算最高位的时候是将不足len位的数全部算进去,循环到len位之下的时候,看似i在减小,讨论的数其实是在增加(默认第i+1位填上了原数).因此每一位计算时,最高位都应该从0开始取.dp数组初始化的时候,dp[0][2] = 1.这个是观察出来的...只有这样i=1之后的数才能根据转移方程计算正确.就像0!=1一样,这样规定之后也是合理的.另外,由于计算结果的时候只计入<N的数,故输入的N要++.原创 2013-08-08 14:06:57 · 804 阅读 · 0 评论 -
[bzoj 1026]windy数[数位DP]
可设计状态: dp[i][j]----有i位的数中,最高位为j的windy数的个数.状态转移方程: dp[i][j] += dp[i-1][k]( k = 0..9 && |j-k| < 2)预处理是考虑首位为0的情况的,因为用它的时候它常常不是首位.计算的时候避免即可.计算结果: 这个时候必须分开算.不足len位的情况要累加.因为此时不考虑先导0. 如果像Bomb那道题一样直接并入最高位的计算的话就考虑了先导0. len位数的计算就仿照Bomb原创 2013-08-08 16:42:34 · 1023 阅读 · 0 评论 -
[HDU 2089]不要62[数位DP]
题意:找出给定区间中不含有4或62的数的个数.思路:本题和Bomb比较像,但是多了一个条件->也不能有4.于是可以想到先求出part1:不含4的数的个数;再求part2:不含4且含有62.其实不需要两个dp,因为求part2的时候dp[i][0]+dp[i][2]就等于dp4[i].但是这道题就让我对Bomb有更清楚的认识了:这道题关键字是49,用的原创 2013-08-09 08:57:53 · 726 阅读 · 0 评论 -
TSP状态转移[状态压缩DP]
dp[1][0] = 0;for (i=3; i<(1<<n); i+=2) //枚举状态.最右为1号城市,遍历奇数就可以枚举所有状态了 for (j=1; j<n; j++) //枚举终点.扫一遍 if (i&(1<<j)) //判断是否合法.状态i是否可以以j为终点 { temp =原创 2013-08-09 15:27:28 · 1365 阅读 · 0 评论 -
[poj 2978]Colored Stones[状态压缩DP]
dp[x][y][z],x指的是[到达第x个石子,包含(意思是参与讨论,并不是说一定留下)第x个石子]的情况下,颜色组合为y(每种颜色占一位),最后一颗石子的颜色为z的最多剩余石子数,因为[第x颗石子去留不一定],所以z不一定等于x的颜色两重循环,只是保证了每种情况都会check一遍,并不是说在当前循环中就一定填哪个位置.从这个层面上说,体现了Dynamic.这也解释了为什么需要取max:因为这个位置可能之前已经填过了,也就是通过之前的某种路线已经到达过这个状态,取max就是动态的选取最优的路线.数原创 2013-08-09 20:11:36 · 1397 阅读 · 0 评论 -
[poj 2411]Mondriaan's Dream[状态压缩DP]
题意:h*w的区域铺上1*2的砖,问有几种铺法.解法一一行一行铺,判断后一行能否从前一行转移而来.解法二(状态压缩DP+DFS记忆化搜索)因为solve是递归的,所以是从最后一行往前填的.state中的1表示(横放或竖放的)被占据的格子,它的前一行对应状态i,i中的1表示(横放或竖放)被占据的格子.0表示其下state上的1为竖放(也就是说按照时间顺序,填i的时候该位置保留为0,填state的时候该0变为1).这样dp[state][n]表示第n行为state状态,1~n-1行填满的方案数.原创 2013-08-10 19:52:09 · 992 阅读 · 0 评论 -
[uva 11762]Race to 1[概率DP]
题意:已知D, 每次从[1,D] 内的所有素数中选择一个Ni, 如果D = 0(mod Ni), 那么D /= Ni,否则D不变(可以看成是每一轮 D/= GCD(D,Ni) )优化:cnt[ ] 可以通过筛选素数以后累加得到kcnt[ ] 也可以通过筛选素数类似的做法得到fac[ ]显然也可以预处理得到而由于处理fac[ i ]的时候需要分解得到 i 的素因子,这里我们继续做一个dpf, dpf[ i ]保存的是 i 的最小素因子, 这样就可以用类似于筛法的过程得到 i 的所有质因子原创 2013-08-14 16:58:59 · 1410 阅读 · 0 评论 -
[poj 3853]Loops[概率DP入门题]
这种题主要就是推状态转移方程..推公式解析:设dp[i][j]表示(i,j)到(R,C)需要消耗的能量[这个定义很重要!]则:dp[i][j]=p1[i][j]*dp[i][j]+p2[i][j]*dp[i][j+1]+p3[i][j]*dp[i+1][j]+2;(走一步,额外消耗能量2)化简得到:dp[i][j]=p2[i][j]*dp[i][j+1]/(1-p1[i][原创 2013-08-14 11:32:25 · 1178 阅读 · 0 评论 -
[HDU 4089]Activation[概率DP]
概率DP.找不到思路的主要原因是不清楚dp数组到底用来表示什么. 进而无法合适地分析状态转移.概率DP是将从当前状态到最终状态一系列多重的选择"封装", 表示为一个最终结果, 然后根据题意的转移方式, 严格分离等号左右两边(常有自我循环, 若是不刻意分别对待容易混乱). 式子列好之后再考虑怎么解.原创 2013-10-13 17:25:27 · 1651 阅读 · 0 评论