随笔分类 - 动态规划
摘要:如题,贪心算法隶属于提高算法效率的方法,也常与动态规划的思路相挂钩或一同出现。下面介绍几个经典贪心问题。(参考自刘汝佳著《算法竞赛入门经典》)。P.S.下文皆是我一个字一个字敲出来的,绝对“童叟无欺”,哈哈。(。⌒∇⌒) 耗费了我的很多时间,所以——希望对大家有帮助啊~ (=^‸^=) 一、背包相关
阅读全文
摘要:P.S.o(︶︿︶)o 唉~虽然这题方程不难,但题目长,代码长,我花了超过3小时!(>﹏<)悲伤辣么大~~~ 谨此题解惠及众人,hh。 题意:给定长度为M的一串颜色序列,和平面上的N个颜色隧道。要求以颜色序列的顺序通过颜色隧道。(隧道可多次使用,可交叉,互不相同。)问从源点到汇点依次通过颜色的最小距
阅读全文
摘要:题意:给定一个队列延迟值为Di的任务,以任意顺序入栈和出栈,第K个出栈的延迟值为(K-1)*Di。问最小的延迟值。 解法:f[i][l]表示完成以第i个任务开始,长度为l,到第i+l-1个任务的最小延迟值。设其中的第j个任务为最后一个出栈的,则f[i][j-i]为先出栈的延迟值,f[j+1][i+l
阅读全文
摘要:题意:有M个家族的蚂蚁,各Ni只(互相相同)。问选出 l~r 只的不同方案数。 解法:很基础的一种DP,不要被“排列组合”所迷惑了啊~我之前接触过这个类型,可惜又忘了,一定要记住!这是一种类型的DP——M种N个进行DP,定义f[i][j]表示前 i 种中(这题是“家族”)选了 j 个(“只”蚂蚁)的
阅读全文
摘要:题意:N个编号为1~N的数,选任意个数分入任意个盒子内(盒子互不相同)的不同排列组合数。 解法:综合排列组合 Stirling(斯特林)数的知识进行DP。C[i][j]表示组合,从i个数中选j个数的方案数;S[i][j]表示Stirling数,i个数分成j份的方案数;P[i]表示P(i,i)全排列。
阅读全文
摘要:题意:有m个人有一张50元的纸币,n个人有一张100元的纸币。他们要在一个原始存金为0元的售票处买一张50元的票,问一共有几种方案数。 解法:(学习了他人的推导后~) 1.Catalan数的应用7的变形。(推荐阅读:http://www.cnblogs.com/chenhuan001/p/51571
阅读全文
摘要:题意:有N个相同的球,M个不同的盒子,每个盒子最多放K个球。请计算将这N个球全部放入盒子中的方案数模1000007后的结果。 解法:f[i][j]表示i个盒子里放j个球的方案数。 1.得到3重循环的坐法,枚举第i个盒子里放k个球——f[i][j]=sum( f[i-1][j-k~j] ) 1 #in
阅读全文
摘要:题意:给一个初始值1,每步操作将1替换为01,将0替换为10。问N步操作后有多少对连续的0。 解法:f[i]表示第i步后的答案。可以直接打表发现规律——奇数步后,f[i]=f[i-1]*2-1;偶数步后,f[i]=f[i-1]*2+1;至于原因——我只能简单说一点。第i步后的答案可由i-1步后的“0
阅读全文
摘要:题意:要求二叉树中每个节点的子节点数为0或2,求有N个节点高度为M的不同的二叉树有多少个(输出 mod 9901 后的结果)。 解法:f[i][j]表示高度为i的有j个节点的二叉树个数。同上题一样,把高度为i的树分解成1个根节点和2棵子树,子树中有一棵高度为i-1,较高,枚举其结点数,另一颗较矮,高
阅读全文
摘要:题意:定义一棵树的所有非叶节点都恰好有n个儿子为严格n元树。问深度为d的严格n元树数目。 解法:f[i]表示深度为<=i的严格n元树数目。f[i]-f[i-1]表示深度为i的严格n元树数目。f[i]=f[i-1]^n+1。d层的严格n元树可分解为1个根节点和n棵d-1层的严格n元树。利用乘法原理,再
阅读全文
摘要:题意:给出在最底层的木头的个数,问有多少种堆放木头的方式。要求木头必须互相挨着在一起。 解法:f[i]表示最底层i个木头的堆放木头的方式。注意递推的思想!只需知道上一层堆放0~i-1个(即最底层堆放i个木头)的方式数就可以利用加法原理得到f[i]。 方法一、用前缀和求解。由于要求木头挨在一起,上层为
阅读全文
摘要:题意:有N个有差别的盒子和分别为A个和B个的红球和蓝球,盒子内可空,问方案数。 解法:我自己打的直接用了求组合C的公式,把红球和蓝球分开看。对于红球,在N个盒子可放任意个数,便相当于除了A个红球还有N个“空”球可放进N个盒子里,这些球之间是无差别的,从这N+A个球中选N个,就是C(N,N+A)。对于
阅读全文
摘要:题意:一共有N只牡牛(公牛)和牝牛(母牛),每2只牡牛间至少要有K只牝牛才不会斗殴。问无斗殴发生的方案数。 解法:f[i][j]表示一共i只牛,最后一只是j(0为牝牛,1为牡牛)的方案数。f[i][0]=f[i-1][1]+f[i-1][0]; f[i][1]=f[i-k-1][1]+f[i-k-1
阅读全文
摘要:题意:问所有的N位数中,有多少个有偶数个数字3的数。 解法:f[i][j]表示i位数中含数字3的个数模2为j的个数。于是分第i位填3还是不填3讨论。 小tip:要模12345;for循环新定义了一个变量会慢一点点~
阅读全文
摘要:题意:问长度为L的所有01串中,有多少个不包含"101"和"111"的串。 解法:f[i][j]表示长度为i的01串中,结尾2位的十进制数是j的合法串的个数。那么,便由f[i-1][ ]逐个推出。 1 #include<cstdio> 2 #include<cstdlib> 3 #include<c
阅读全文
摘要:这题与前面的“踩方格”重复了,而且是大坑题!题目漏写了取模12345的条件! 详细解析请见我之前的博文——http://www.cnblogs.com/konjak/p/5936888.html 而这坑在我打了高精+滚动之后才知道。。我先把这个代码贴上来。。 1 #include<cstdio> 2
阅读全文
摘要:这题题意与前面的“判断整除”重复了。具体解释可看我这篇的博文。 http://www.cnblogs.com/konjak/p/5936738.html
阅读全文
摘要:题意:N个饰物,有重量和渴望程度。问在M的重量限制内能达到的最大的渴望度。 解法:经典的01问题,但有一个小技巧值得记住:用if比较大小比调用max函数快了不少,这题有100ms左右。
阅读全文
摘要:题意:有N瓶酒,不能连续喝>=3瓶的酒,问能喝的最大的酒量。 解法:同前一题相似,可以f[i][j]表示前i瓶中连续喝了j瓶的最大酒量。1.f[i][0]=f[i-1][3] ; 2.i=1或2时,f[i][j]=f[i-1][j-1]+a[i]; 3. f[i][3]=mx;也可以只用f[i]。
阅读全文
摘要:题意:n个数中不能同时选连续m个或以上,问方案数。 解法:f[i][j]表示从前i个中选,到第i个已经连续选了j个。j!=0时, =f[i-1][j-1] ; j=0时, =f[i-1][0~m-1] ; 优化1:f[i][m]存f[i-1][0~m-1],就不用多for一重。 1 #include
阅读全文

浙公网安备 33010602011771号