DP
文章平均质量分 83
满赋诸机
这个作者很懒,什么都没留下…
展开
-
2016年第七届蓝桥杯省赛(C/C++ A组)
父亲和儿子 枚举生日蜡烛 枚举填格子 DFS快速排序去掉尾1四则运算 DFS剪邮票 DFS四方定理 枚举回文串 区间DP区间DP最小回文代价经典例题最大公比原创 2016-03-20 18:26:24 · 6928 阅读 · 10 评论 -
HDU-3652 B-number (数位DP)
感觉入错坑了...非递归的数位DP好难写(虽然一次AC了),但是一看别人的递归数位DP,非常简洁,还不容易出错,需要赶快换一下本题比原先做的又多了一个限制:数还要满足是13的倍数,然后就又不会了...看了题解的设置状态的部分,瞬间明白了,可以再加一维表示余数的状态,然后利用模运算的性质就能顺利成章地想到以下这种转移状态(又看到有非递归的题解,感觉还是写的麻烦了)原创 2016-05-11 21:47:06 · 574 阅读 · 0 评论 -
HDU-2126 Buy the souvenirs (DP)
起初想到的状态:dp[i][j]表示选了i种不同的纪念品且花费为j时的方案数,最后在最大不同纪念品数上求和即可,但是没想好如何转移(没有把当前方案数保存,每次计算都是覆盖式的),结果总WA,后来看了一下题解,幡然醒悟,感觉dp还需要加强,多训练设dp[i][j]表示选了i种不同的纪念品且花费不超过j时的方案数,则状态转移方程为:dp[i][j]+=dp[i-1][j-t[k]];便于状态转移方程的解释:设dp[k][i][j]表示前k种纪念品中选了i种不同的纪念品且花费不超过j时的方案数进行到第k种纪原创 2016-04-19 13:05:53 · 414 阅读 · 0 评论 -
ZOJ-3380 Patchouli's Spell Cards(概率DP&&大数)
看了题解后发现大神总结抽象能力好强,抽象成:有m个位置,在每个位置随机填上1~n个数,求相同的数至少有l的概率?即使这样还是没有思路,认为是容斥什么的直接计算,完全想不到概率DP大致思路如下:正难则反,统计填满数后相同的数小于l的情况设dp[i][j]表示前i个数占据j个位置的方案数(且每个数占据的位置小于l)该状态可由前i-1个数占据j-min(j,l)+1 ~ j个位置转移而来,保证第i个数占据的位置小于l则状态转移方程为:dp[i][j]=∑dp[i-1][j-k]*c(m-j+k,k)原创 2016-05-03 23:17:31 · 403 阅读 · 0 评论 -
UVA-624 CD (DP)
依旧是一个01背包,不过需要输出路径(题目没说明时间和相同时该怎么办,看了样例认为是选取歌曲最多的),按升序排序后,状态转移是先达到的,但由于从时间短的歌曲开始转移,所以转移到的第一个一定是歌曲最多的(AC后看到别人谈到这题是Special Judge...)最初用dp[i]记录时间和i是否能够凑成,cur[i]表示时间和为i时选的最后一个歌的下标,AC之后又想到可以将dp数组与cur数组合并,减少空间浪费原创 2016-04-18 22:26:06 · 480 阅读 · 0 评论 -
SGU-495 Kids and Prizes(概率DP)
最终期望是每个人拿到奖品的概率之和,考虑同时只存在一个人拿到盒子第i个人拿到奖品的概率与前一个人拿到奖品的概率有关,所以设dp[i]表示第i个拿盒子的人拿到奖品的概率则dp[i]可由两个状态转移而来:①第i-1个拿盒子的人拿到奖品,概率为dp[i-1],则第i个拿盒子的人拿到奖品的概率为:dp[i-1]-1/n②第i-1个拿盒子的人没有拿到奖品,概率为1-dp[i-1],则第i个拿盒子的人拿到奖品的概率为:dp[i-1]可得:dp[i]=(1-dp[i-1])*dp[i-1]+dp[i-1]*(d原创 2016-05-02 22:17:20 · 498 阅读 · 0 评论 -
HDU-4856 Tunnels(BFS&&状压DP)
大致思路:先bfs预处理出任意两点的最短路,然后就转换为TSP问题,由于必经的隧道很小,所以可以用状压DP设dp[i][j]表示当前i中二进制中为1的位已经走过,且最后一个走过的隧道为第j条隧道【注意】必须把表示走过的某些隧道这个状态放在最外层,把隧道放在最内层,WA在这2.5h,还是不太熟悉状压DP只有这样才能保证当前使用的状态是最优状态,否则就限定了部分遍历隧道的顺序①若未遍历的隧道在最外层,则限定了最后一个必定经过第m-1条隧道②若已遍历的隧道在最外层,则限定了倒数第二个必定经过第m-1条隧原创 2016-05-02 17:32:31 · 448 阅读 · 0 评论 -
HDU-1003 Max Sum (DP)
大致思路:定义dp[i]表示以i为结尾的子串的最大和,再用sta数组保存其起始下标即可,进行状态转移刚开始对sta数组也开了一个数组存储下标,但是发现cur只用一次,如果及时更新答案就不用数组保存了,然后就换成curSta表示当前子串的起始下标(其实dp数组也可以不需要,但是为了符合习惯,就不省略了)过了这么久再写一次,发现写的方法还是一样(总想着减少时间和空间)原创 2016-04-18 18:45:15 · 423 阅读 · 0 评论 -
Codeforces-148D Bag of mice (概率DP)
大致思路:设p[i][j]表示公主在有i只白鼠,j只黑鼠时先手获胜概率,p[i][j]表示恶龙在有i只白鼠,j只黑鼠时先手获胜概率则状态转移方程为:d[i][j]=i/(i+j)+j/(i+j)*(1-(i/(i+j-1)*p[i-1][j-1]+(j-1)/(i+j-1)*p[i][j-2])); p[i][j]=i/(i+j)+j/(i+j)*(1-d[i][j-1]);即:d[i][j]=1-(i*j*p[i-1][j-1]+原创 2016-05-02 10:05:45 · 472 阅读 · 0 评论 -
POJ-2151 Check the difficulty of problems (DP)
可以用dp求得每支队伍做出k道题的概率设dp[i][j][k]表示第i只队伍在前j题中做出k题的概率则状态转移方程为:dp[i][j][k]=(1-p[i][j])*dp[i][j-1][k]+p[i][j]*dp[i][j-1][k-1];由于是每个队伍相互独立事件,所以直接相乘即可总是想着正面求解,而忘了正难则反的原理首先统计每个人至少做出一题的概率:prob_1=1-∏dp[i][m][0];再统计每个人做出的题目数目均在1~n-1之间的概率:prob_2=∏(∑dp[i][m][k])原创 2016-05-02 00:23:34 · 363 阅读 · 0 评论 -
HDU-4568 Hunter (Dijkstra&&状压DP)
先做的hdu-4571感觉和那题差不多,都需要先处理出任意两点的最短路,不过本题少了一个限制,所以dfs是结局不了的,然后就不会了...看了题解后,发现必经点少,可以进行状态压缩储存已经过的点,就想到以前做过更相似的题(hdu-5418),才发现这都是TSP问题为了方便,增加虚拟的开始与终止节点,不过这样会增加很大的常数手快打错了,导致又浪费好处时间。真是 脑抽1秒钟,调试n小时。原创 2016-04-01 10:35:59 · 635 阅读 · 0 评论 -
ZOJ-3640 Help Me Escape (概率DP)
状态没设对,导致直接没法转移应该设dp[f]表示战斗力为f时,逃离时经过的天数的期望则:①f>c[i]时,本次能从i点逃离,dp[f]=t[i]/n;②f<=c[i]时,本次不能从i点逃离,dp[f]=∑(dp[f+c[i]]+1)/n;由于各状态是离散的,所以只能通过dfs进行状态转移原创 2016-05-01 21:41:15 · 497 阅读 · 0 评论 -
POJ-3071 Football (概率DP)
设dp[i][j]表示在第i轮,队伍j胜出的概率则dp[i][j]=∑(p[j][k]*dp[i-1][j]*dp[i-1][k]),k为在第i轮可能会和j比赛的队伍然后不知道怎么计算什么队伍之间会在第i轮比赛看了题解后发现可以运用位运算,队号从0开始观察规律(以0号队伍为例):第一轮:(0,1)第二轮:(0,2),(0,3)第三轮:(0,4),(0,5),(0,6),(0,7)……第i轮能够比赛的队伍,他们从第i+1为开始均相同,而第i位均不同,所以可以对队号先右移i-1位,再让其中一个原创 2016-05-01 21:02:18 · 348 阅读 · 0 评论 -
HDU-3853 LOOPS (概率DP)
设dp[i][j]表示从(i,j)开始到达目标状态时消耗魔力的期望,则dp[r][c]=0;状态转移方程为:dp[i][j]=p1*(dp[i][j]+2)+p2*(dp[i][j+1]+2)+p3*(dp[i+1][j]+2);解得:dp[i][j]=(p2*dp[i][j+1]+p3*dp[i+1][j]+2)/(1-p1);写的时候觉得不能写成“人人为我”型,导致有个常数,时间较长,其实直接从(r,c)开始枚举即可。。。(但是时间并没有快多少)【注意】如果非(r,c)点,p1为1时,则不会进入原创 2016-05-01 20:19:42 · 363 阅读 · 0 评论 -
HDU-4599 Dice (概率DP)
设dp[i]表示已经连续掷出n次同一个数字时,离目标状态还需掷骰子次数的期望,则dp[n]=0,dp[0]=dp[1]+1则状态转移方程为:dp[i]=1/6*(dp[i+1]+1)+5/6*(dp[1]+1); ①有两种方法可求得dp[0]方法一:设参数a[i],b[i],使得 dp[i]=a[i]*dp[1]+b[i]; ②②带入①右边原创 2016-05-01 16:34:58 · 416 阅读 · 0 评论 -
HDU-4597 Play Game (区间DP)
设dp[i][j][k][l]表示先手从a数组区间[i,j]中以及b数组区间[k,l]中能选得的最大数字和则dp[i][j][k][l]可由四个状态转移而来:①先手拿a[i],由dp[i+1][j][k][l]转移而来,即 a[i]+sum(i+1,j,k,l)-dp[i+1][j][k][l];②先手拿a[j],由dp[i][j-1][k][l]转移而来,即 a[j]+sum(i,j-1,k,l)-dp[i][j-1][k][l];③先手拿b[k],由dp[i][j][k+1][l]转移而来,即原创 2016-05-01 00:17:05 · 547 阅读 · 0 评论 -
HDU-4035 Maze (概率DP&&树形DP)
理解题以后觉得没法做。。。只理解了有向图,因为本题是无向边,所以父子结点的概率互相影响,立刻就忘了上一题也存在这种情况。。。看了题解后才明白,应该按照期望设状态,而且需要在树上进行状态转移,最开始的状态转移方程最后化简即可消除影响(貌似就是树形DP+概率DP)设dp[i]表示从i号结点走出迷宫时走过边数的概率,par[i]表示i号结点的父亲结点,son表示i号结点的儿子结点:①若i结点为叶子结点,则 dp[i]=k[i]*dp[1]+e[i]*0+(1-k[i]-e[i])*(dp[par[i]]+1原创 2016-04-30 12:44:11 · 940 阅读 · 0 评论 -
ZOJ-3329 One Person Game (概率DP)
设dp[i]表示点数i离目标状态还需掷骰子次数的期望状态转移方程很好想:dp[i]=∑(p[k]*dp[i+k])+1/(k1*k2*k3)*dp[0]+1; ①但是由于存在dp[0],所以没法直接使用刚开始我用dp[i]-dp[i+1]求出一个方程,然而右边常数项没了,就没法进行转移。。。看了题解后才发现:由于dp[i]与dp[0]都有线性关系,所以可以设系数原创 2016-04-30 09:15:57 · 474 阅读 · 0 评论 -
Codeforces-55D Beautiful numbers (数位DP)
想着前面做的加余数维的方法,想着弄成11维dp...但是时空都会超,然后就又不会了数位DP果真太难了,状态好难想,貌似只有dfs有模版...看了题解后了解到:如果一个数能整除a,b,...,z,则该数必定能整除他们的最小公倍数lcm而1~9的最小公倍数为2520,且1~9中所有的可能的最小公倍数有48个,可以对最小公倍数离散化所以可以设dp[25][50][2520],dp[i][ha[j]][k]表示长度为i时,且前面位的最小公倍数为j,且高位的数模MOD的值为k时,满足题意要求的答案原创 2016-05-14 22:32:22 · 526 阅读 · 0 评论 -
HDU-3709 Balanced Number (数位DP)
又是一个状态很难想的数位DP对于一个非0数x,最多只存在一个支点pivot使力矩为0所以支点不同时的统计个数不重复(不包括0),可以直接相加所以可以设dp[i][j][k]表示长度为i时,支点为j,且高位的数的力矩为k时,满足题意的数的个数原创 2016-05-14 23:27:50 · 585 阅读 · 0 评论 -
hihocoder-1048 状态压缩·二(状压DP)
以前只做过2*n的棋盘用2*1的矩形覆盖,深切感觉到数据不同就真是不同的题;n*m的感觉真的好难,看了提示,终于感觉能写了,不过还是调试了很久才AC没怎么做过这种状压DP,想不到其他更简单的实现提示方法的代码看到别的大神都是只压缩当前行的状态,还不能深刻理解,待以后能力更强了再学习!原创 2015-11-19 17:14:58 · 1769 阅读 · 2 评论 -
Codeforces Round-#373 (Div. 2 && Div. 1) [Codeforces719 && 718]
题目链接 Div. 1 Div. 2 官方题解719 - A - Vitya in the Countryside题目大意一个月有3131天,每天月亮的尺寸为0,1,…,14,15,14,…,1,0,1,…,14,15,14,…,1,,第二月又重复上面循环,现给出连续nn天的月亮尺寸求判断下一天月亮尺寸的大小变化,不能确定则输出−1-1。思路 - 模拟按照题意判断即可,注意坑点有最后一天是00原创 2016-09-27 23:09:20 · 492 阅读 · 0 评论 -
51NOD-1405 树的距离之和(树形DP)
首先可以想到在O(n)内用树形DP求出某一点到其他所有点的距离和设dp[u]表示以结点u到其子树所有结点的距离和,cnt[u]表示包括u在内的子树中所有结点个数,v为u的子结点,则有:原创 2016-06-10 13:07:26 · 996 阅读 · 0 评论 -
Codeforces Round #355 (Div. 2) [Codeforces677]
A Vanya and Fence 模拟B Vanya and Food Processor 模拟C Vanya and Label 模拟快速幂D Vanya and Treasure 分类E Vanya and Balloons DP预处理原创 2016-06-02 13:00:43 · 793 阅读 · 0 评论 -
2013首届陕西省赛
1069: Donald’s company (最小生成树)1071: Rectangle Counting (枚举)1072: National Disaster (Tarjan)1073: Nunchakus (DP)原创 2016-05-21 12:17:46 · 781 阅读 · 0 评论 -
HDU-1028 Ignatius and the Princess III(DP[完全背包]||生成函数)
解法一:DP[完全背包]母函数入门题,但是看着这种母函数的模版就觉得像完全背包,实际一看题,第一反应还是完全背包因为本题数的拆分不考虑顺序,所以只考虑方案的序列非减即可,用完全背包的方法从数1开始枚举到数n即可解法二:生成函数原创 2016-06-07 14:13:32 · 715 阅读 · 0 评论 -
HDU-2089 不要62 (数位DP)
感觉这一类的数位DP已经比较熟悉了,但是其他类型的还没接触过...原创 2016-05-09 18:08:04 · 784 阅读 · 0 评论 -
POJ-2762 Going from u to v or from v to u? (强连通分量[Tarjan]&&(拓扑排序||树形DP))
先找出所有的强连通分量,则各强连通分量内是相互可达的,只用判断强连通分量之间是否至少单向可达将各强连通分量缩成一点,建立新图,则新图是DAG刚开始也认为只要从一个入度为0的点到出度为0的点的长度为总点数,就满足题意,否则不行,但是看见有人说不是只有一条链的情况下会输出Yes,于是放弃了最终用拓扑排序AC,若某次队列中点的数目大于1(则这些点之间不能单向可达),则输出No,否则输出Yes没有初始化indeg数组,导致WA了很久都没看出来...原创 2016-04-24 20:34:41 · 632 阅读 · 0 评论 -
HDU-3555 Bomb (数位DP)
数位DP入门题设dp[i][0]表示长度为i,不含49的数字个数;dp[i][1]表示长度为i,不含49且最高位为9的数字个数;dp[i][2]表示长度为i,含有49的数字个数不是很明白为什么第二维状态要这样取...原创 2016-05-08 19:06:48 · 1116 阅读 · 0 评论 -
XDU-1043 Boooooom (概率DP)
设dp[i][j]表示前i个人中有j个人来上课的概率,初始:dp[0][0]=0;状态转移方程为:dp[i][j]=dp[i-1][j]*(1-p[i])+dp[i-1][j-1]*p[i];计算n个人中来上课的人数大于等于k时的概率为sum则可求的上课天数的期望为:sum+sum^2+…+sum^x,(x→∞)等比数列求和得:sum/(1-sum)原创 2016-05-08 14:32:46 · 754 阅读 · 0 评论 -
HDU-4089 Activation(概率DP)
设dp[i][j]表示有i人队,排在第j号位置时,达到目标状态的概率,初始:dp[1][1]=p4/(1-p1-p2),则dp[n][m]即为答案则状态转移方程为:①j==1:dp[i][1]=p1*dp[i][1]+p2*dp[i][i]+p4;②1<j<=k:dp[i][j]=p1*dp[i][j]+p2*dp[i][j-1]+p3*dp[i-1][j-1]+p4;③k<j<=i:dp[i][j]=p1*dp[i][j]+p2*dp[i][j-1]+p3*dp[i-1][j-1];即:①j=原创 2016-05-06 17:17:13 · 703 阅读 · 0 评论 -
HDU-4336 Card Collector(状压概率DP||容斥原理)
感觉做了这么多概率dp,还是离熟悉比较远合集里看到的,结果一眼就看到是用状态压缩做,然后状态都出来了,转移就没什么难度了...设dp[i]表示当前取到了i的二进制中位的为1的卡时,离达到目标状态还需要购买方便面的期望,初始状态:dp[(1<<n)-1]=0;则dp[i]可以转化为:①:下一袋方便面没有卡,或j卡已有,即:(∑p[j]+pp)*(dp[i]+1);②:下一袋方面面存在j卡,且当前没有,即:(∑p[j]*(dp[i|(1<<j)]+1);则状态转移方程为:dp[i]=(∑p[j]+p原创 2016-05-06 06:57:12 · 822 阅读 · 0 评论 -
USACO-Section 4.3 Buy Low, Buy Lower (DP[LIS])
原来这题考的是大数加法,还以为只是一个最长下降子序列(需要不同的统计方案数)寻找前面的最长上升子序列时,倒着枚举,则若这个序列的末尾数字出现多次,那么最后一个一定是方案数最多的,那么之前以该数字出现形成的方案数可以不计感觉手敲一个正数的加法还是可以的原创 2016-04-21 14:07:03 · 337 阅读 · 0 评论 -
HDU-1501 (POJ-2192) Zipper (DFS||DP)
要不是放在dp专题里面,我还一直以为只能dfs做看到一个dp的解法,才明白如何进行状态转移设dp[i][j]表示串a的前i个字符与串b的前j个字符是否能形成串c的前i+j个字符,若dp[i-1][j]&&a[i]==c[i+j]或dp[i][j-1]&&b[j]==c[i+j]时,dp[i][j]才为true我写的最外层循环是枚举串c的字符,内存分别枚举串a和串b的字符,这样方便初始化和理解(串c的下标从1开始),但有一个常数原创 2016-04-20 21:17:55 · 424 阅读 · 0 评论 -
2016 "百度之星" - 资格赛(Astar Round1)
Problem A (前缀积&&乘法逆元)Problem B (DP)Problem C (Trie树)Problem D (map)原创 2016-05-16 00:01:06 · 680 阅读 · 0 评论 -
HDU-4734 F(x) (数位DP)
好不容易遇见一个较为简单的数位DP,结果忘了求f(a),直接传入a,还debug半天...看数据范围可以知道,max(f(x))=f(999999999)=4599,所以设dp[25][4615]即够dp[i][j]表示长度为i的数,f(x)大小不超过j的数的个数原创 2016-05-15 11:00:06 · 584 阅读 · 0 评论 -
SPOJ-BALNUM Balanced Numbers (数位DP)
第一反应又是每一个数字都添加一维,又变成11维dp,时空是过不去其实可以发现,每一个数字只有3中状态,未出现、出现奇数次、出现偶数次,这样就可以采用三进制进行状态压缩,就变成二维状态了设dp[i][j]表示在前面状态是j的情况下,低i-1位取满足题意的数的个数原创 2016-05-15 09:04:10 · 704 阅读 · 0 评论 -
HDU-4405 Aeroplane chess (概率DP)
大致思路:设dp[i]表示从点i出走到结束游戏掷骰子次数的期望①若点i出无法跳跃,则只能依靠掷骰子前进,则 dp[i]可以转化为六种状态:dp[i+1],dp[i+2],dp[i+3],dp[i+4],dp[i+5],dp[i+6],概率均为:1/6②若点i处可以跳跃,则可以转化为一种状态:dp[nxt[i]],概率为:1原创 2016-04-29 23:28:53 · 389 阅读 · 0 评论 -
POJ-2096 Collecting Bugs (概率DP)
设dp[i][j]表示在j个子部件中找到i种bug时离最终状态的期望的天数,则有dp[n][s]=0则dp[i][j]可由转化为下列四种状态:①dp[i][j]:表示在已有bug的j个子部件中找到已发现过的bug,概率为:(i/n)*(j/s)②dp[i+1][j]:表示在已有bug的j个子部件中找到一个新的bug,概率为:((n-i)/n)*(j/s)③dp[i][j+1]:表示在一个新的子部件中找到一个已发现过的bug,概率为:(i/n)*((s-j)/s)④dp[i+1][j+1]:表示在一原创 2016-04-29 15:14:55 · 347 阅读 · 0 评论 -
POJ-3744 Scout YYF I (概率DP&&矩阵快速幂)
设dp[i]表示安全到达点i处的概率,则状态转移方程为:①点i处有雷,dp[i]=0;②点i出无雷,dp[i]=dp[i-1]*p+dp[i-2]*(1-p)由于雷坐标的范围很大,而雷的数量很少,所以需要用矩阵快速幂对无雷的路段进行优化原创 2016-04-29 11:09:34 · 466 阅读 · 0 评论