动态规划
文章平均质量分 59
神奇豆子
这个作者很懒,什么都没留下…
展开
-
lightoj 1125 - Divisible Group Sums 01背包变形
给定一个n,q以及n个数字,代表有q次询问,每次询问一个d,m,选择m个数字(不可重复选)组成集合是d的倍数有多少种方法q比较小可以先不考虑...对于一个数字选与不选就构成01背包...选择了多少个数字当做背包体积吧...因为要求方案数,所以不能拿余数当做价值了...得另外再开一维当做余数,那么选了确定x个数字后余数是多少也要顺便枚举一下吧...注意,01背包的滚动数组体积那重循环原创 2016-03-30 14:15:14 · 322 阅读 · 0 评论 -
lightoj 1193 - Dice (II) 前缀和优化DP
和lightoj 1145 差不多的题意,只不过这个问的是所有面上和为s的方法的点数乘积和...相对于上一题,这题难度爆炸啊...推导前缀和的公式简直了...参考别人博客自己又推导一下...点击打开链接#includeusing namespace std;#define ll long long#define ull unsigned long long#define mod原创 2016-04-01 11:16:11 · 382 阅读 · 0 评论 -
lightoj 1191 - Bar Codes 简单DP
给定一个n,k,m,求一个n位的二进制数,由k段连续0或者1组成,然后每段不超过m个的方案数。没前导0.问题转化一下就是,k个数字,每个数字取值为1-m,组成一个和为n的方法有多少种。就是和lightoj 1145一样的问题啦。而且范围只有50,但是卧槽时限只有0.5s啊...前缀和优化走起..我觉得这个题可以用数位DP做的#includeusing namespace std;原创 2016-04-01 12:05:42 · 337 阅读 · 0 评论 -
lightoj 1038-Race to 1 Again 期望类DP
给定一个n,然后每次可以找到n的一个因子x包括1和本身, 然后n=n/x,直到n为1为止,求次数期望。网上公式一大堆,不过貌似可以用筛选法来做毕竟筛选法也是可以在筛出因子的同时将贡献加进去..#includeusing namespace std;#define ll long long#define N 100000double dp[N+10];int cnt[N+10];原创 2016-03-21 17:17:17 · 382 阅读 · 0 评论 -
lightoj 1044 - Palindrome Partitioning DP优化DP
给定一个串,问这个串可以最少拆分为几个回文子串。一开始就想到了dp[i]代表i之前有多少个回文串,然后枚举j,区间[j,i]是否回文,如果是回文的话min(dp[i]=dp[j-1]+1,dp[i]).但是n有1000,枚举i,j还要判断区间回文,复杂度n^3肯定要爆...苦思冥想,其实预处理一下hw[i][j]判断i,j是否是个回文串。之前做过回文串类的区间DP,一个两重循环就可原创 2016-03-22 16:29:18 · 408 阅读 · 0 评论 -
lightoj 1047 - Neighbor House DP
有n个房子,每个房子都可以染红绿蓝三种颜色,并且给出了每个房子染每种颜色费用,相邻房子不能同色,求染完房子的最小费用。dp[i][j]就是第i个房子染第j个颜色后的总费用。简单的DP..#includeusing namespace std;#define ll long long#define N 1005int dp[N][3],R[N],G[N],B[N];int main原创 2016-03-22 16:56:56 · 424 阅读 · 0 评论 -
lightoj 1194 - Colored T-Shirts 状压DP
给定n个人的序列,m个衣服颜色,衣服颜色编号为1-m,问要所有衣服颜色相同的人站在一起需要交换的最小次数是多少。n有10W...因为题目没有说顺序啊,10w个数字进行交换的话太大了。然而m=16,一副标准状压的范围...那么就是对于一个i的状态来言,就是考虑新加入一个i状态中没有的颜色j,这个颜色放在最前面(好写,当然放在最后面也是可以的)所需要消耗多少次数呢...就是j颜色放在所有i中出原创 2016-04-05 10:23:52 · 511 阅读 · 0 评论 -
lightoj 1200 - Thief 完全背包
有一个人,他老婆叫他买一些东西,然后他决定去偷。他老婆给他了一张清单,清单上的所有的东西至少有c[i]个...然后他有一个W容量的包,问清单上的东西偷够之后他最多还能带走东西的最大价值为多少?能带走的物品是清单上的东西先把背包的容量减去清单上要偷的,剩下的做一个完全背包就好了...#includeusing namespace std;#define ll long long#def原创 2016-04-05 10:36:34 · 256 阅读 · 0 评论 -
lightoj 1201 - A Perfect Murder 树形DP
题意和hdu1520类似,就是选择一个点后,与这个点有边相连的都不能选..问最多选多少个点。写法也和hdu1520类似..树形DP入门题..dp[i][0]代表没选i这个点最多选择多少点,dp[i][1]选择了i这个点最多能选多少个点。这个题没说图一定联通...终于在lightoj刷到树形DP了...#includeusing namespace std;#define l原创 2016-04-05 11:13:21 · 347 阅读 · 0 评论 -
lightoj 1205 - Palindromic Numbers 数位DP
给定a,b,问[a,b]之间有多少个回文数....肯定的数位DP...dp[i][j]代表i位数并且以j开头有多少个回文数...很容易想到转移方程dp[i][j]+=dp[i-2][k]...但是边界如何处理...卡了好久。看了xdlove博客,还要在对着边界dfs一发...以后还是写记忆化搜索吧....苦逼#includeusing namespace std;#defi原创 2016-04-05 13:50:23 · 422 阅读 · 0 评论 -
lightoj 1217 - Neighbor House (II) DP
给定n个点组成的环,如果选择了某个点就不能选择相邻的点,问最大的权值和...环类的DP一直做不来,就想到了一个很挫的办法就是强行选择第一个和强行不选第一个...找出来最大值。#includeusing namespace std;#define ll long long#define ull unsigned long long#define mod 100000007#de原创 2016-04-05 14:04:25 · 396 阅读 · 0 评论 -
lightoj 1173 - The Vindictive Coach 计数类DP
给定n个人,排成一个波浪形的队伍,n个人按个头高低已经编好号了。有个队长编号为m,队长是必须在最前面的,如果m=1..就不用管,否则队长后面那个要比他低...读题坑,公式写了半天没推出来看了别人博客恍然大悟。附上连接:点击打开链接#includeusing namespace std;#define ll long long#define ull unsigned long lo原创 2016-03-31 19:29:53 · 454 阅读 · 0 评论 -
lightoj 1180 - Software Company 二分+DP
有一个软件公司,做俩项目,俩项目必须同时交,也就是说完成时间是看最后一个,然后每个项目拆成m个模块...可以同时做不同的模块,做完就好了,有n个人,给出n个人分别完成第一个项目的一个模块和第二个项目模块的时间,问最少需要多少时间交项目dp[i][j][k]代表前i个人做了j个第一项目模块k个第二项目模块的最短时间。然后对于j,k 都要在多加一重循环枚举这个人做了多少...五重循环复杂度原创 2016-03-31 17:14:16 · 379 阅读 · 0 评论 -
lightoj 1126 - Building Twin Towers DP
给定n个数字,然后选择一些数字分成两堆,这两堆的和相等,求最大的和...首先求一下所有数字的和...那么最后结果肯定小于等于sum/2。然后范围50W...那么肯定滚动数组先,然后两数字的差当做第二维...两数字的差要修正一下范围100W,遍历也要100W..然而可以并不需要,因为我们可以dp[i][j]代表选择前i个数字后两数字相差为j的最大值,那么最大值减去差值就是最小值。如果最小原创 2016-03-30 15:18:56 · 347 阅读 · 0 评论 -
lightoj 1134 - Be Efficient DP 思路
给定一个n,m,以及n个数字,问有多少个子串(连续的子序列)和是m的倍数...dp[i]代表进行到某一个数字时,余数为i的方案数,对于一个和sum来说,如果加上当前的这个数字余数为i,那么这一段肯定是m的倍数...很机智的做法..#includeusing namespace std;#define ll long long#define mod 1000000007#de原创 2016-03-30 15:55:39 · 352 阅读 · 0 评论 -
lightoj 1140 - How Many Zeroes? 数位DP
问[a,b]之间有多少个0..应该属于简单数位DP,考虑的应该是如果没有非0元素出现的话不能加0...除非是0那么多加一个变量就好了。还有输入是32位无符号整数,我用Int一直过不了样例..真是..本来我dp数组只开了一维发现总是少状态多加了一维...难道我做数位DP少开一维是天赋误导技能么#includeusing namespace std;#define ll l原创 2016-03-30 16:50:36 · 379 阅读 · 0 评论 -
lightoj 1145 - Dice (I) 前缀和优化DP
给定一个骰子,骰子有k个面,然后有n个,问n个骰子正面朝上的数字和为s的有多少种方案。很容易想到一个n*s*k的DP,但是很容易爆炸。首先n*s是肯定不能少的,那么k这一重循环可以省么,是可以的。其实对于一个和s来言,就是加上i-1的s-1到s-k..那么我们可以用前缀和来优化掉。就是连续k个和加起来,每次往后一次在加一个减一个...挺好想到的#includeusing name原创 2016-03-30 17:36:09 · 480 阅读 · 0 评论 -
lightoj 1147 - Tug of War DP压位
有n个人每个人都有一定重量,然后分成两组,要求两组人数相差最多为1,且重量差最小...直接01背包判断某个重量能否被到达...WA了。开始没注意到人数相差最多为1每种能达到j重量的人数都应该保留..那么需要再开一维判断人数...用dp[j]的值代表有多少个人,如果人数一样的状态不需要保存两次又..那么n=50,二进制下LL可以表示...如果dp[j]的某一位为1那么这一位的人数可以原创 2016-03-31 09:16:01 · 374 阅读 · 0 评论 -
lightoj 1157 - LCS Revisited LCS求方案数
给定俩字符串,求LCS的方案数..基本就是正常求LCS,求LCS的时候如果dp[i][j]被谁更新了那么方案数f[i][j]要同时被更新..但是如果dp[i-1][j],dp[i][j-1]相等...要怎么加我直接加起来样例么过...调试最后一组的时候发现,各种多加..网上看了别人才懂是容斥。#includeusing namespace std;#define ll long原创 2016-03-31 09:49:32 · 399 阅读 · 0 评论 -
lightoj 1158 - Anagram Division 状压DP
给定一个数字串s和数字d,问有多少种不同的排列是d的倍数..开始想直接DP,但是考虑到可能无法去重所以状压DP,每次找到一个没有取的数字,加上去...然后根据前面lightoj1060学的康拓逆展开...重复元素再除一下阶乘OK过样例提交TLE..优化了一个地方时间缩短一半。#includeusing namespace std;#define ll long long原创 2016-03-31 10:18:04 · 309 阅读 · 0 评论 -
lightoj 1159 - Batman LCS
给定三个字符串,求三个串的LCS...同两个串的LCS..#includeusing namespace std;#define ll long long#define mod 1000007#define inf 0x3f3f3f3fchar s1[60],s2[60],s3[60];int dp[60][60][60];int main(){ int t;原创 2016-03-31 10:30:30 · 304 阅读 · 0 评论 -
lightoj 1169 - Monkeys on Twin Tower 简单DP
英语苦手...翻译最难,给定俩座塔,塔有n层,每层一只香蕉,猴子每次玩从下往上吃,可以从一座塔跳到另外一座,问吃n个香蕉需要的最短时间。吃香蕉也要时间的话为啥一座塔往上走一层不需要时间...很迷然后意思大概明白就是推样例。对于在i层来言,最短时间要么就是在下一层过来或者从另外一座塔跳过来..很基础的DP..#includeusing namespace std;#define ll原创 2016-03-31 10:56:50 · 341 阅读 · 0 评论 -
lightoj 1170 - Counting Perfect BST 数学+DP
给定一个区间范围a,b,a,b内所以可以表示为x^y的数字可以组成的二叉排序树有多少种...只知道n个节点能够成的二叉排序树种类是卡特兰数...可以DP求...(leetcode某题)那么现在 任务就是求出所有的x^y的数字...肯定要筛法..一直在考虑81是9^2也是3^4那么会重复算啊..我那么傻逼不会容斥。然后网上看到别人引入了一个基的概念...定义一个数是基,当原创 2016-03-31 11:43:10 · 337 阅读 · 0 评论 -
lightoj 1223 - Testing Mailboxes 区间DP
给定n个盒子,然后盒子有个坚固程度,可以抵抗x个炸弹的同时爆炸抵挡不了x+1那么坚固程度就是x。现在给出n个盒子,坚固程度最大可能值为m,问需要多少个炸弹才才能确定精确的坚固程度。因为T是1W肯定是个打表题。开始没看懂以为炸弹可以一个一个放,也就是x放上去没炸开,下次在放一个...参考了窝A的博客:点击打开链接#includeusing namespace std;#defin原创 2016-04-05 15:03:36 · 439 阅读 · 0 评论 -
lightoj 1050 - Marbles 概率DP
俩人玩游戏,共有r个红球b个蓝球,先手可能拿个红色也可能拿个蓝色,后手必然蓝色。如果后手不能拿到蓝色(没了)且红色有剩余就是先手输,最后一个拿到的是蓝色且红色没了先手赢。问先手赢的概率。我概率dp很烂,基本没学,但是看到这个题有个猜想。每次拿两个球当做一轮,按照第几轮去推导。那么先手这一轮拿红色的概率是由上一轮的dp[r-1][b-1](后手拿蓝),或者先手拿蓝后手也拿蓝就是dp[r][b原创 2016-03-23 10:32:46 · 327 阅读 · 0 评论 -
关于概率dp的个人理解与总结
原文来自:http://blog.csdn.net/wdcjdtc/article/details/38424029首先,概率dp主要解决的是关于概率问题和期望问题的求解。难点和普通dp一样在于dp[i][j][k]的维数控制和含义,其实就是转移方程的构建。然后一般地,求概率是正推、求期望是逆推。(开始的很多状态不可能发生概率为0,最后的状态出口期望为0)对于求概率转载 2016-03-14 17:24:26 · 824 阅读 · 0 评论 -
lightoj 1246 - Colorful Board DP+组合数
给定n+1*m+1的图,然后曼哈顿距离为奇数的点不能同一种颜色..有k种颜色,问涂完整张图有多少种方案。这个题去年寒假在NBUT的红包赛里出现过....比赛中没出..首先考虑1 1点肯定不能和点的x+y是奇数的颜色一样...可以和其他的点颜色相同,那么一个图就分成两半...就是一半x+y为偶数的点用a种颜色,另外的用b种颜色,切a+b我组合数学烂的可以,感觉可以容斥,但是不会推啊-原创 2016-04-07 14:59:45 · 449 阅读 · 0 评论 -
lightoj 1064 - Throwing Dice 简单DP
给定n个骰子,问和不小于x的概率是多少。n个骰子总情况是6^n,然后用dp求解出大于x的情况数的和,两者变分数就好了。long long已经足够...dp[i][j]代表前i个骰子的和为j的方案数...那么很容易想到转移方程dp[i][j]+=dp[i-1][j-k],k为1-6...#includeusing namespace std;#define inf 0x7ffffff原创 2016-03-25 17:24:56 · 362 阅读 · 0 评论 -
lightoj 1030 Discovering Gold 概率dp求期望
lightoj 1027也是个求期望的,百度才明白公式,作为一个概率论差点挂科的彩笔概率这东西学习好困难。概率DP求期望弱认为先正着求一遍概率,在过一遍算期望理论上应该是对的,但是有时候直接逆推期望会变得很简单。dp[k]代表到达k这个点获得金子的期望....#includeusing namespace std;double dp[120];int g[120];int ma原创 2016-03-15 15:46:50 · 385 阅读 · 0 评论 -
lightoj 1252 - Maintaining Communities 树形DP
有n个点n-1条边组成的连通图,问可以最少分成多少个联通块,并且每个块里的权值和小于k...权值和是块里的边权和。对于一个节点u来言,他的一个子节点v可能和他一起也可能不一起,类似于01背包的感觉。dp[i][j]代表i点所在权值和为j的最小联通块数量...对于u的一个子节点来言就是做背包的过程,要不要把这个子节点加入到u里...#includeusing namespace s原创 2016-04-08 14:09:13 · 449 阅读 · 0 评论 -
lightoj 1257 - Farthest Nodes in a Tree (II) 树直径
给定一棵树,问树上每个点到其他的点最远的距离。首先所有点到树的直径两端点肯定是最远的(请百度树的直径,所以就是所有点到树的直径两端点那个更长..任选一点跑一边搜索找出来树的直径一个端点,在一遍搜索就可以找到另外一个端点,顺便求得所有点到这个端点的距离啦。然后再来一遍求另外一个端点到所有点的距离...#includeusing namespace std;#define ll l原创 2016-04-08 14:55:23 · 406 阅读 · 0 评论 -
lightoj 1068 - Investigation 数位DP
给定a,b,k,问[a,b]之间有多少个k的倍数并且各个位数的和也是k的倍数的数字。因为a,b是int范围所以k>90肯定不成立。接下来按照数位DP考虑肯定要考虑两个余数...,但是k这个数字取值的最小公倍数过于大,瞬间懵逼..看了别人的才知道每次都初始化去做...仔细想想复杂度也不高...#includeusing namespace std;#define inf 0x7f原创 2016-03-29 09:09:38 · 361 阅读 · 0 评论 -
lightoj 1071 - Baker Vai DP
给定一个n*m的矩阵,然后一个人从左上角出发到右下角,只能走右边或者下边,然后再回来.,要求一个点不能走两次及其以上..开始没看懂题,写了一个走两遍找最大的错了...发现题意点不能走两次...可以当做两个人走不能走一条路...然后根据做过的类似的题目,dp[s][x1][x2],x1x2分别代表两个人所在的行,那么可以根据步数s得到列...然后每次判断下一步两个点是否会重合,重合的原创 2016-03-29 12:19:37 · 520 阅读 · 0 评论 -
lightoj 1326 - Race DP
给定n匹马赛跑,每两匹马之间会产生三种结果,分别是和,A胜、A负。然后问n匹马之间有多少种结果。因为每匹马都是不同的,然后因为有名次并列,所以i匹马可能只有j个排名。(j#includeusing namespace std;#define mod 10056int dp[1200][1200];int ans[1200];int main(){ int t,n;原创 2016-05-06 19:53:12 · 473 阅读 · 0 评论 -
lightoj 1283 - Shelving Books DP
给定n个书本的厚度,然后依次放到书架上,要么放在最左边要么放在最右边,或者不放,要求书的厚度是非递减的序列。然后问最多放置多少本书。数字范围10^5,但是只有100个数字,我们先离散化一下。然后对于放置一本书来言,就是要么增大下界,要么减小上界,或者上下界都不变。那么我们可以采用dp[i][j]代表当前下界为i上界为j最多放置多少本书。对于一个新的书,就是产生dp[a[i]][j]原创 2016-05-18 17:38:56 · 623 阅读 · 0 评论 -
lightoj 1025-The Specials Menu 区间DP
给定一个字符串,删除其中某些字符,问有多少种方法使得这个串是个回文串。把问题颠倒一下,有多少个回文串添加了一些字符成了题目给的串。对于dp[i][j]代表i,j之间有多少个回文串,最后加的字符一定是两边,分别是dp[i+1][j]和dp[i][j-1],但是这两个区间内有交叉,多了个dp[i+1][j-1]。但是如果a[i]==a[j],那么i+1,j-1之间的所有回文串都可以在两端加上a原创 2016-03-14 16:50:09 · 321 阅读 · 0 评论 -
lightoj 1021 - Painful Bases 状压DP
给定一个base进制和一个模数k,然后给个base进制下的数字,问这些数字全排列中(在base进制下)是k的倍数有几个。范围又是16,又是状压DP。对于一个状态i来言,如果i&(1#includeusing namespace std;#define ll long longll dp[(1<<16)+3][22];int num[22];char s[22];int ma原创 2016-03-14 16:28:05 · 409 阅读 · 0 评论 -
lightoj 1051 - Good or Bad DP
给定一个字符串,如果存在三个连续的元音字母或者五个连续的辅音字母就是bad,否则是good,但是字符串中存在?,这个可以是任何字母,如果bad和good都能到达的话就是mixed。开始就是想着乱搞,先判断是否肯定是bad,然后接着xjb弄。但是考虑一下dp[i][j][k]代表到达i这个地方有连续j个元音或者连续k个辅音的状态能否达到。开始不想开三维,只是开两维判断一下,但是状态转移过于麻原创 2016-03-23 12:00:25 · 486 阅读 · 0 评论 -
1226 - One Unit Machine DP+组合数
有n个任务,每个任务都有a[i]个小任务组成,完成一个任务是要把所有的小任务全部完成..第i个任务要在i+1个任务之前完成。那么n个任务有多少种不同的方式完成..首先dp[i]代表完成i个任务的方案数,那么对于下一个任务来言,要保证最后一个小任务一定在最后面..那么对于a[i+1]-1个任务来言,可以放置的空间是从sum+a[i+1]-1中选取a[i+1]-1个....我组合数学学的很烂也可以原创 2016-04-06 10:14:05 · 375 阅读 · 0 评论 -
lightoj 1057 - Collecting Gold 状压DP求解TSP
给定一张n*m的图,x是起点,g代表金子,然后一个人从x出发收集完所有的金子需要走多少步,八联通的图。标准的TSP问题,直接拿挑战的代码上了。#includeusing namespace std;#define inf 0x7fffffffchar a[30][30];int dp[(1<<18)+10][18];struct node{ int x,y;}s[30原创 2016-03-24 09:50:16 · 339 阅读 · 0 评论