动态规划
文章平均质量分 72
自在_飞花
这个作者很懒,什么都没留下…
展开
-
Codeforce 487B Strip 动归+二分+线段树
写完之后的第一感觉就是我又写麻烦了。。。写了两棵线段树维护信息。。。dp[i] 表示[1,i]这段前缀的最优解,若dp[i] = INF,表示无解。特殊的,dp[0] = 0。那么,有一个思路就是我们有一些长度为设dp[i]已知且dp[i] != INF,那么设我们知道一个位置R,满足[i+1,R]这一段区间可以划分到一段,i+1 = l。那么我们将dp[i+1],dp[i+2].原创 2015-05-04 17:44:32 · 1046 阅读 · 0 评论 -
FZU 2153 A simple geometric problems 凸包 + DP
给出五十个点,构造出一个凸包,让尽可能多的点在上面。首先要说一下凸包的构造过程。极角:设参考点为R,对于点P的极角即为向量RP与X正方向的夹角。显然极角的取值范围为 [0,180] ,所以参考点R应选择 y 坐标最小的,若有多个,则选x最小的。然后按极角大小升序排列。参考点不参与排序,或者说默认为最小。设置空栈。从前向后枚举点 p[i]。当栈中的元素原创 2014-04-06 00:50:46 · 1735 阅读 · 0 评论 -
基础树形DP小结
HDU 1520 Anniversary party隔层选取,比较基础的树形DP了。HDU 2196 Computer我只想说一句这是毛线DP,明明是图论好么。两次BFS求出权值和最大的一条链,再用两次BFS更新各点最大值。搜了一下,真的有人用DP做,貌似更快一些。原创 2014-04-28 10:08:47 · 977 阅读 · 0 评论 -
HDU 4044 GeoDefense
设 t 为根节点到某一叶子节点路径上的权值和,则应让最小的 t 尽量的大。坑点在于存在价格为零的商品。一维倒序递推就失去了意义,无法保证每组选且只选一个。另外可以选择不建立任何塔防,也就是说每个节点都多了一个price和power均为零的商品。dp[s][k] 表示在 s 姐点投入 k 时所能取得的最大值。#include #include #include #inclu原创 2014-05-06 11:18:06 · 1152 阅读 · 0 评论 -
Google Code Jam Round1B B题
一眼就看出这是个数位DP了好吗。原创 2014-05-04 03:30:29 · 835 阅读 · 0 评论 -
HDU 4003 Find Metal Minaral 树上瞎搞分组背包
对于分组背包,每组选且只选一件商品的写法原创 2014-05-05 10:04:39 · 983 阅读 · 0 评论 -
POJ 2468 Apple Tree 树上瞎搞分组背包
昨晚Debug了好久始终找不出哪里错了,今早再一看发现自己已荣升逗比Beta 2.0 Version.个人感觉此题为HDU 4003 的弱化版。把每棵子树都看成一类商品,在每类商品中至多选一件。则问题转化为最基本的分组背包问题。dp[s][c][k] c == 1时,表示在s结点不返回时走K的最大收益,c == 0时,表示在s结点重新返回时走k步的最大收益。可以dfs从底到顶更新d原创 2014-05-05 09:51:49 · 1329 阅读 · 0 评论 -
HDU 3033 I love sneakers! 分组背包
我是个逗比。。。真心不是搞算法的料不太中规中矩的分组背包,分组至少选一件商品。dp[i][j] 可以由当前dp[i-1][j-c] 和 dp[ i ][j-c]更新得到。#include #include #include #include #include #include #include #include #include #pragma comment(link原创 2014-05-04 21:08:12 · 761 阅读 · 0 评论 -
基础数位DP小结
HDU 3555 Bombdp[i][0] 表示含 i 位数的方案总和。sp[i][0] 表示对于位数为len 的 num 在区间[ 10^(i-1) , num/(10^(len-i)) ] 内的方案数。对于dp[i][3],dp[ i ][ 0 ]表示位数为 i 且含49的方案数,dp[ i ][1]表示位数为 i 且不含49 且末尾不为4的方案数,dp[ i ][2]表示位数原创 2014-04-22 19:19:58 · 1016 阅读 · 0 评论 -
Codeforces 55D Beautiful numbers 数位DP
自从去年4月份学姐教完我数位DP,还是第一次写出这么漂亮的代码,也是醉了。首先你要知道sum%(x*n) %x == sum%x,这样就可以在dfs的时候记录2到9的最小公倍数2540取余了。#include #include #include #include #include #include #include #include #include #pragma c原创 2015-01-19 20:47:42 · 745 阅读 · 0 评论 -
484D - Kindergarten DP
把每一段单调序列分成一组可以接近最优质。然后在此基础上讨论这一段的单调序列的两个端点该分到哪个序列里面,记录一下最优值。#include #include #include #include #include #include #include #include #include #include #include #pragma comment(linker,"/原创 2015-01-15 20:51:38 · 742 阅读 · 0 评论 -
Codeforces 18D Seller Bob && 18E Flag 2 简单dp
D题很恶心的要用大数。dp[i] 表示到第 i 条信息的最大收益。显然,dp[1] = 0。对于i > 1有,若当前信息为 win x,那么显然有dp[i] = dp[i-1]。若当前信息为sell x,那么dp[i] = max(dp[i-1] , dp[j] + 2^x),j 需满足j import java.util.Scanner;import java.math.原创 2014-11-04 14:35:00 · 1043 阅读 · 0 评论 -
Codeforces 16E Fish 概率DP
这一场好水啊。。这题算是比较简单的概率DP了吧,外加一点状压。dp[sta] = sigma (dp[sta|(1之所以要除( (ans+1)*ans/2 ),是因为在ans+1条鱼中一共有这些对,且这些对等概率。#include #include #include #include #include #include #include #include #incl原创 2014-11-03 14:21:14 · 960 阅读 · 0 评论 -
CodeForces 14 E - Camels && D - Two Paths
D - Two paths只想到了一个o(n^2)的解法。首先枚举删除一条边,必然得到两棵独立的树。计算两棵树的直径。保留最大乘积。首先两条路不相交,则必然可以分到两棵子树中,因为要乘积最大,所以两条路必为两棵子树的直径。#include #include #include #include #include #include #include #include #原创 2014-10-29 15:29:53 · 708 阅读 · 0 评论 -
CodeForces 12D Ball 多级排序 + 离散 + 线段树
给出B,I,R,对于Pi,若存在Pj满足 Bi probable self-murderers。问存在多少个Pi。首先对其升序排序,优先级为B > I > R。然后发现对于i 然后由于数据范围较大,对 I 进行离散,建立线段树记录大于I的区间内最大的R是多少,当然此时要从后往前扫描,边更新边计数。#include #include #include #include #i原创 2014-10-28 09:54:25 · 888 阅读 · 0 评论 -
CodeForces 10D. LCIS 最长公共上升子序列模板题 + 打印路径
推荐一篇炒鸡赞的blog。下面代码中有打印路径。#include #include #include #include #include #include #include #include #include #include #include #pragma comment(linker, "/STACK:1024000000");#define EPS (1e原创 2014-10-26 20:47:31 · 1206 阅读 · 0 评论 -
CodeForces 6D Lizards and Basements 2
算是简单DP了,一开始竟没看出来,醉了。首先,对于当前位置site,需知道site-1处丢了pre个,site处丢了now个火球,然后枚举site+1处的情况。#include #include #include #include #include #include #include #include #include #include #include #prag原创 2014-10-24 08:41:37 · 957 阅读 · 0 评论 -
HDU 4588 Count The Carries 数位DP || 打表找规律
2013年南京邀请赛的铜牌题。。。做的很是伤心,另外有两个不太好想到的地方。。。。a 可以等于零,另外a到b的累加和比较大,大约在2^70左右。打表查规律比较神奇,上图不说话。打表的代码#include #include #include #include #include #include #include #include #include #pra原创 2014-06-20 16:09:13 · 853 阅读 · 0 评论 -
POJ 3373 Changing Digits 好蛋疼的DP
一开始写的高位往低位递推,发现这样有些时候保证不了第四条要求。于是又开始写高位往低位的记忆化搜索,又发现传参什么的蛋疼的要死。然后又发现高位开始的记忆化搜索就是从低位往高位的递推呀,遂过之。dp[i][j]记录在i位 且 余数为j时的最优解情况。dp[i][j].next表示当前的最优解是由哪一种状态转移过来的。代码又写锉了。。#include #include #includ原创 2014-06-10 10:44:15 · 1041 阅读 · 2 评论 -
HDU 4597 Play Game 记忆化搜索
这道题还是去长春之前看的,当时以为是博弈什么的。后来学长是记忆化搜索,当时连简单的DP都不会,只好先扔到一边了。dp[s1][e1][s2][e2] 表示第一排剩[s1,e1] ,第二排剩 [s2,e2] 时的最优决策。dp[s1][e1][s2][ e2 ] = sum - min(dfs(s1,e1,s2+1,e2),dfs(s1,e1,s2,e2-1),dfs(s1+1,e1,s2,原创 2014-03-22 20:53:37 · 874 阅读 · 0 评论 -
基础概率DP小结
题目链接:http://acm.sdut.edu.cn:8080/vjudge/contest/view.action?cid=113#overviewC题 Bag of mice:记忆化搜索。p[ w ][ b ] 表示有w个白老鼠 b个黑老鼠是的概率。此时若公主取得白鼠则胜,否则若公主取胜则必须有恶龙在下回合取得黑鼠。D题 Check the difficulty of原创 2014-04-17 01:37:20 · 933 阅读 · 0 评论 -
URAL 1117. Hierarchy
给出一棵中序遍历为1,2,3,4,5,6. . . . .的满二叉树。然后从编号为 a 的节点发一封信到 编号为 b 的节点。每次只能从 i 传到 (i-1) 或者 (i+1),花费等于路上的点的个数(端点除外)。问从a 到 b发一封信的最小花费是多少。尼玛,读题读了一万年,活该CET不过。dp[ i ] 表示 从 1 到 (i 即 dp[ i ] = dp[原创 2014-02-28 17:22:56 · 895 阅读 · 0 评论 -
URAL 1635. Mnemonics and Palindromes
给出一字符串,将其分割成一系列回文串,子串数量应尽可能的少。由于昨天刚做了一个类似的题,看完题的第一思路就是枚举区间,时间复杂度o(n^3),妥妥的TLE了。然后开始想各种优化,均无果。倒是顺便看了一下四边形不等式优化。然后又换了一种思路时间复杂度降到了o(n^2) 。幸好大部分代码还能用,数组的下标运算还错了一次. . . .if(Is_Palindrome( i , j ) )原创 2014-02-27 22:50:03 · 1203 阅读 · 0 评论 -
URAL 1183 Brackets Sequence 记忆化搜索 + DFS
这个烂题是昨天这个点开始看的. . . . . .然后卡到现在。第一次做需要记录路径的题。大体可以想到是在记忆化搜索的回溯阶段确定那两个括号可以匹配,可就是写不出来啊。然后去问尚神怎么实现的(自从虎哥和崔老师走了之后,貌似只有尚神一个人可以问了. . . .),尚神说跟我的状态转移方程不一样。不过说了一下记录路径的思路,大体上还是差不多的。寻找路径的两种方法,一种是在回溯过程中记录,另一种原创 2014-02-26 20:56:33 · 898 阅读 · 0 评论 -
位运算
学习状态压缩 必须要先搞懂位运算 这是集中位运算的符号与其作用。名称C/C++样式Pascal样式简记法则按位与&and全一则一,否则为零按位或|or有一则一,否则为零按位取反~not是零则一,是一则零按位异或原创 2014-02-25 20:04:24 · 1147 阅读 · 2 评论 -
URAL 1152 False Mirrors 状压+记忆化搜索
英雄每秒钟可以摧毁三个连续的阳台(大Google给出的翻译。。 。 ),剩余阳台上的怪物每秒钟会对英雄造成一个单位的伤害。为英雄受到伤害的最小值是多少。阳台数 n 算了一下最多会用九秒钟,然后计算次数大约是这样(1话说写代码的时候我正在看自己的位运算的博客. . . . . .然后南壕不屑的看了我一眼走了. . . . . .我没翻题解啊状态转移方程 dp[ t ][ s原创 2014-02-25 20:53:28 · 1157 阅读 · 0 评论 -
URAL 1586. Threeprime Numbers
公式没多长时间就推出来,本来想着能 1 A 的来着,结果两个for循环写错位置了。 。 。。 凄凉的调试了一下午。。。。 感觉动规更像是对暴力穷举的优化,在枚举了所有状态之后,你所得到的答案肯定是正确的或者说是最有的。所以没有必要去证明公式的对错。 话说我最开始做DP的时候一直在纠结怎么去证明式子是对的。 。 。。原创 2014-02-25 18:19:43 · 966 阅读 · 0 评论 -
URAL 1017 Staircases 记忆化搜索
终于刷了道还算上的了台面的题了 . . . . . .给你N个方块,让你排成M(M >= 2)列,每列的块数Si要满足(Si =1)。问一共有多少种排列方案。首先需要预处理出排成M列所需要的最少的块数,即 pre[ M ] = 1 + 2 + 3 + ... + M-1 + M。然后对于确定的N,M的取值需满足 2 设 M 的最大取值为Max。然后我们计算出把 N-p原创 2014-02-24 09:40:16 · 1093 阅读 · 1 评论 -
URAL 1260 Nudnik Photographer 简单的递推
给出N个数,分别是1,2,3 . . . . . .N,然后回答按照两项规则排列这N个数的方案数。1,两个相邻的数的差不能超过2。2,1必须放在第一个位置。思路:对于第 n 个数的放置方案其实只需考虑 (n-1) 和 (n-2) 的情况。1,(n-1)和(n-2)相邻且在最后,此时可细分出两种情况,即(n-2)在后面(情况1)和(n-1)在后面(情况2)。2,(n-1)和(原创 2014-02-23 15:53:16 · 1090 阅读 · 0 评论 -
POJ 1014 Dividng 多重背包的二进制优化
对于有n种物品,每种mi件,背包容量为 v 的多重背包,如果直接转化成01背包,时间复杂度为∑mi*v,显然当两者乘积太大时,TLE无疑。现在有一种对用二进制减小∑mi的优化方法。对于一种有mi件,体积为vi的商品,可以用 k+2种 体积分别为(1(1例如 mi = 13,则可分解成 1,2,4,和一个 6。也就是说对于一种有mi件的商品可以分解成有(k+2)种只有一件的商品来代替原创 2014-02-19 23:39:26 · 754 阅读 · 0 评论 -
最长公共子序列
1 #include 2 #include 3 4 int a[510][510]; 5 char m[510],z[510]; 6 7 int main() 8 { 9 int lm,lz,im,iz,i,t;10 while(gets(m+1) != NULL)11 {12 gets(z+1);13原创 2013-09-18 15:20:23 · 649 阅读 · 0 评论 -
POJ 1159 Palindrome
寻找串与其逆串的最长公共子序列。 因为此子序列必是回文串,剩下的字符就是需要插入的。 1 #include 2 #include 3 #include 4 #include 5 6 #define Max(a,b) a > b ? a : b 7 8 using namespace std; 9 10 char s1[501原创 2013-09-18 15:22:09 · 688 阅读 · 0 评论 -
SDUT 2408 Pick apples
Pick applesTime Limit: 1000ms Memory limit: 165536K 有疑问?点这里^_^题目描述 Once ago, there is a mystery yard which only produces three kinds of apples. The number of each kind is infinite. A原创 2013-09-18 15:20:31 · 714 阅读 · 0 评论 -
POJ 3628 Bookshelf2 / POJ 3624 Charm Bracelet / POJ 1384 初涉01背包与完全背包
都是最基本的01背包,题意就不讲了。01背包的状态转移方程,2维:dp[ i ][ j ] = max{dp[ i -1 ][ j ] , dp[ i-1][ j-w] + p}; 1维:dp[ i ] = max{dp[i] , dp[i-w] + p};1维时要从大向小枚举,若从小向大枚举则变成了完全背包。POJ 3624 #include #incl原创 2014-02-18 10:40:32 · 979 阅读 · 0 评论 -
POJ 2392 初涉多重背包
题意:有K种石头,每种石头的高度为H,个数为Q,放置高度不能超过C。问这些石头最高的可达高度是多少。裸的多重背包。对于N种,K件的多重背包可以转换成∑ki的01背包。假设不存在限制C时,则先放A种还是先放B中对结果无影响。当添加上限制条件C时,应该让C小的在下面。故在进行01背包前要将C排序。#include #include #include #include #原创 2014-02-18 16:26:21 · 828 阅读 · 0 评论 -
初涉分组背包 HDU 1561 The more,The better
给出一个森林,每棵树均为一组物品,首先推出每棵树可以组成的物品种类。然后是基本的分组背包模板。即 最外层枚举组数,次外层枚举背包容量,内层枚举物品体积。 对于每棵树有 ans[root][i+j] = ans[root][ i ] + ans[son][ j ]。 题水数据也水,不多说了。#include #include #include #include #in原创 2014-04-30 14:01:57 · 1150 阅读 · 0 评论 -
ZOJ Problem Arrangement 递推+状压
对于dp[ i ][ j ] , 设 i 的二进制中 1 的个数为 Si。则dp[ i ][ j ]表示在前Si行中,选取 i 的二进制对应的列所能得到分数 j 的方案数。则递推方程为:dp[ t ][ k ] += dp[ i ][ j ] , Si +1 == St && (t 的二进制与 i 的二进制有且只有一位不一样,换言之,只能在Sl行选取未在前 Si 行选取的一个列)。原创 2014-04-13 21:06:18 · 1264 阅读 · 2 评论 -
URAL 1495. One-two, One-two 2
dp[ i ][ j ] 表示 长度为 i 的 对 n 取余为 j (若 j == 0 , j = n) 的最优解。mod[1][ i ] 表示1 * (10)^(i-1) 对 n 取余的余数,若 (mod[1][ i ] == 0 ,则 mod[ 1 ][ i ] = n)。mod[2][ i ]同理。状态转移方程 dp[ i ][ j ] = min(dp[ i-1 ][j - mod原创 2014-03-18 12:32:51 · 902 阅读 · 0 评论 -
URAL 1427. SMS
dp[ i ] 表示前 i 个字符的最优解。if( s[i] 为 latin letter || space){if(如果前 (i-1) 个字符的后 m 个 全部为latin letter || space)dp[ i ] = min(dp [i-k]) + 1;(1 elsedp[ i ] = min( min(dp[ site + k1 ]) , min(dp[i-k2原创 2014-03-10 15:03:55 · 962 阅读 · 0 评论 -
URAL 1900. Brainwashing Device
乍看此题,还以为是扫描线+贪心,每次都扫描出最多的那个站,但是时间复杂度太高,而且写到一半的时候发现了反例. . . . . 接下来开始推式子:dp[ i ][ j ] = max(dp[ k1 ][ j ],dp[ k2 ][ j -1] + ans[site[ k2 ][j-1]+1][i])。k1原创 2014-03-15 12:43:23 · 1090 阅读 · 0 评论