随笔分类 -  递推

摘要:题意:给定N(1#include #include #include #include using namespace std;typedef unsigned long long LL;const int N = 70;LL f[70][70];// f[i][j]表示将i个盘通过j个柱子从第一根柱子移动到最后一根柱子所需要的最少次数 int path[70][70]; // 表示f[i][j]的得到的最优移动方案是先将最小的path[i][j]个盘移动到某一根柱子上 int n, m;stackstk[70];char ocp[70];void pre() { memset(f, 0... 阅读全文
posted @ 2013-09-04 22:11 沐阳 阅读(1128) 评论(0) 推荐(0) 编辑
摘要:题意:转化后为给定一个数L,问L拆成N个不同的数相加的方案数,其中N>=2。解法:其实和上次做的分解的2的幂的数量相同,由于要求每个数都不相同,这里有一个非常好的观察角度,那就是观察一个数的分解中是否存在1,再加上考虑其能够被分解的数的个数即可建立递推关系。设f[i][j]表示数 i 被分成 j 个不同的数相加的方案数,那么考虑最后分解中不含有1,那么这部分由f[i-j][j]得到,因为后者的每一个分解出来的数都加上1就行了;接着考虑分解中含有1,那么可以假定这个1就是最后分出来的,因为分解的顺序并不影响最后的结果,由于分解中数均不相同,扣除1后,就变成了f[i-1][j-1]中不含有1 阅读全文
posted @ 2013-05-31 18:20 沐阳 阅读(499) 评论(0) 推荐(0) 编辑
摘要:题意:给定一个很优美的三角形,问从第1层走到第N层的走法有多少种?解法:由于每一层能够向左右行走到任意位置再向下走,所以设f[i]为从第一层到第 i 层的方案数,则有递推关系f[i] = f[i-1] * 2 * i。由于最后的结果是对1000003取余,所以1000003之后的结果一定都为零。代码如下:#include <cstdlib>#include <cstring>#include <cstdio>#include <iostream>#include <algorithm>#include <set>using 阅读全文
posted @ 2013-05-31 18:00 沐阳 阅读(204) 评论(0) 推荐(0) 编辑
摘要:题意:给定一个函数定义如下:对于q个点满足:给定f[1]-f[n]的数值,然后存在q个特殊的点,其于前面的关联的项数特殊,系数特殊,当然位置也特殊。现在要求f[n]的值。解法:如果题目中没有强调q个特殊点的话,那么可以使用矩阵快速幂搞出来。鉴于只有最多100个特殊点,我们可以选择分段进行处理,对每一个空隙进行一次矩阵快速运算,然后对于特殊点单独做一次。这里又有一个地方要特别注意:那就是q个点中有位置大于n的点。当然仅仅是一般的矩阵快速幂这题的复杂度将达到O(q*log(n)*L^3),结合多组数据这样会超时,一个优化就是使用一个列向量去依次乘以若干个矩阵,那么每一次相乘的复杂度就变成了L^2, 阅读全文
posted @ 2013-04-28 19:53 沐阳 阅读(464) 评论(0) 推荐(0) 编辑
摘要:题意:有N个节点的图,现在要求构成一棵树(不存在环),且只能够有一个跟节点,每一层的节点数还必须相同。问有多少种不同的方式。解法:对于N个节点而言,如果第N个节点是N-1个节点任意一种组合情况下的boss的boss,这种事满足情况的,用f[N]表示方案数的话,那么这部分的值就是f[N-1];如果N不属于上面的情况,那么可以认为N个节点的组合下,boss下面就直接分成了一个个支,由于各层节点数要相等,因此每个分支的情况都要一样,所以N-1有多少个大于2的因子就有多少种情况了。综上:如果把f[x-1]看作一个分支的话,有:代码如下:#include <cstdlib>#include 阅读全文
posted @ 2013-04-25 13:52 沐阳 阅读(209) 评论(0) 推荐(0) 编辑
摘要:题意:已知A0 = 0 , A1 = 1 , An = 3 * An - 1 + An - 2 (n >= 2). 求 AAAAN Mod (1e9 + 7) (也就是A[A[A[A[N]]]])。解法:标程竟然使用set+pair来寻找循环节,并且第一次循环节长达222222224,不知道内存要吃掉多少。由于是一个嵌套的定义,因此要找出每一层的循环节,最终推出最内层的循环节为240,次之为183120,再之222222224,最后就是1e9+7了。通过矩阵快速幂求解第x项还是飞快的,注意当某一层为0时最后的结果就为0了。代码如下:#include <cstdlib>#inc 阅读全文
posted @ 2013-03-20 19:07 沐阳 阅读(545) 评论(0) 推荐(0) 编辑
摘要:题意:问最少多少个过同一点的平面能够将空间分成N份。解法:这题的基本思路肯定是求出x个平面最多能够划分出多少个子空间,然后二分枚举出答案。小涛神说了一种非常神的方法来解这一题,那就是得到三组最简单的解,假设最后的通项公式是一个最高次为1次的表达式,那么采用待定系数法用两组数据得到表达式然后使用第三组检验前两组得出的解。如果不相符的话那么再推出一个解,假设通项公式最高次为2次解方程...最后就能够得到这题的通项公式:f(x) = x*x - x + 2。 当然,我是想使用递推公式来解决这一问题,由于三个平面最多将空间分成8份,而在增加一个平面的话,由于所有平面都要过一个点,那么三个平面就已经确. 阅读全文
posted @ 2013-03-19 19:00 沐阳 阅读(258) 评论(0) 推荐(0) 编辑
摘要:题意:给定1,2,3...N个数的集合,现在求所有非空子集(相同元素不同位置视为不同)按字典序排序后的第M个集合是什么?思路:设i个不同元素组成的非空字典序子集为kind[i],通过递推关系计算出kind[i] = i * (kind[i] + 1)可从计算式上推倒。得到这个关系后就可以通过一位一位的枚举得到答案了。代码如下:#include <iostream>#include <cstring>using namespace std;int seq[25], idx;long long kind[25];int vis[25];void deal(int N, lo 阅读全文
posted @ 2013-03-03 12:20 沐阳 阅读(1343) 评论(0) 推荐(0) 编辑
摘要:题义:规定这样的一个序列,只由A,B,C,D四种字符组成,并且A和C的个数都为偶数个,现在问一个长度为N的序列,有多少种构成方式能够使长度为N的串满足这些要求。解法:对于任意长度的一个串,我们设定三个状态f[i][0]表示满足要求的合法串, f[i][1]表示A和C只有一个字符不满足的非法串, f[i][2]表示A和C均不满足的非法串。那么就有递推关系 f[i][0] = 2*f[i-1][0] + f[i-1][1], f[i][1] = 2*(f[i-1][0] + f[i-1][1] + f[i-1][2]), f[i][2] = f[i-1][1] + 2*f[i-1][2].根据这个 阅读全文
posted @ 2013-01-25 19:57 沐阳 阅读(248) 评论(0) 推荐(0) 编辑
摘要:该题说明了状态开设的意义一样,但是从哪个方向去理解推倒状态的转移对解题非常关键.该题扣住是否所有的盘子中有空盘子,就得到了一个非常简单且优美的方程.如果从当前盘子的放置状态或者是当前苹果的放置状态来求解状态转移方程就不能写出来.这和题意中的相同盘子,相同苹果有很大的关系.代码如下:#include <cstdlib>#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;int N, M, dp[15][ 阅读全文
posted @ 2013-01-11 13:37 沐阳 阅读(908) 评论(6) 推荐(0) 编辑
摘要:该题题意很简单,题目中定义了丑数的概念,即这个数只有2,3,5这几个因子,现在要我们输出前1500个丑数的任意一个.前面没想到好的方法,直接想着打表了,前面700个能够在线跑出来,后面的就打了个表.#include <cstdio>#include <cstring>#include <cstdlib>#include <iostream>#include <algorithm>using namespace std;bool is(int x) { while (x % 2 == 0) x /= 2; while (x % 3 == 阅读全文
posted @ 2013-01-10 21:50 沐阳 阅读(388) 评论(0) 推荐(0) 编辑
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2232 直接进入正题,这题要求解的是一个条件极其宽松下的组合题,似乎在看见这题的时候,我们就能遇见这道题的答案会是多么的庞大,所以题中也才会有 % 9937 这样的提示。对于如此大的一个运算,只走一步的话还好办,有9种情况,(顺时针和逆时针旋转2次加上相邻两个交换位置(交换一对的4次,交换两对的2次)最后加上原地不动的1次),就1次就够麻烦的,计算结果表明,两步共有633种可能, 足以见得后面的情况是多么的复杂。 各种百度后,我接受了接下来说明的好的方法。保留一定量的信息,通过递推求得,再在这些.. 阅读全文
posted @ 2011-10-16 17:58 沐阳 阅读(378) 评论(0) 推荐(0) 编辑
摘要:汉诺塔IIITime Limit: 1000/1000 MS (Java/Others)Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 3657Accepted Submission(s): 1668Problem Description约19世纪末,在欧州的商店中出售一种智力玩具,在一块铜板上有三根杆,最左边的杆上自上而下、由小到大顺序串着由64个圆盘构成的塔。目的是将最左边杆上的盘全部移到右边的杆上,条件是一次只能移动一个盘,且不允许大盘放在小盘的上面。现在我们改变游戏的玩法,不允许直接从最左(右)边移到最右(左) 阅读全文
posted @ 2011-08-12 21:49 沐阳 阅读(3927) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示