随笔分类 -  递推

摘要:递推(DP)http://codeforces.com/contest/313/problem/B题意:比较好懂,一个字符串只有.或者#字符,给你一段区间[x,y],其实y>x,让你在这个区间里面统计一个数字,即这个子串,相邻两位,若s[i]=s[i+1]则计数一次,然后输出结果这题一看,其实想到了线段树,因为原串,如果一段连续的.....则看成是一串白色的段,一段连续的#####则看成是一段黑色的段,那么原串可以看成是线段树的总区间被一系列的黑白段覆盖,对于每个查询就在线段树上查询它被什么黑白段覆盖,并且覆盖了多长,不过鉴于比赛时间短,而且好像大材小用的感觉,就没再往线段树上面想,比赛 阅读全文
posted @ 2013-05-31 08:36 Titanium 阅读(388) 评论(0) 推荐(0)
摘要:动态规划(递推)选拔赛的题目,也是2012国赛的题目。题意:给n个节点,构建一棵树,使到同一层的节点所拥有的子节点数相等,问能构建出多少个这句话,“使到同一层的节点所拥有的子节点数相等”,并没有把话说得很白,但是细想就可以发现,这句话是等同于说,这棵树是对称,而且非常对称,甚至可以想象到,以树根为轴,把树劈成两份,两边是对称的,取其中一边,再以树根劈开,两边还是对称的(这样强的对称性才满足题目说的那句话)所以基于这点,我们可以想到,除开树根外,下面的子树(可能一棵子树,或者两棵,多棵),一定要完全相同的,为什么?哪怕每棵子树是对称的,但是子树与子树之间不同,那么都挂在树根上的时候,是不能满足 阅读全文
posted @ 2013-03-10 21:26 Titanium 阅读(834) 评论(0) 推荐(0)
摘要:递推,卡特兰数题意:输入n,表示圆上有n对点也就是2n个点,每个点要与另一个点且只能与一个点相连,用直线将两点相连,那么会产生n条线,但要求这n条线不能出现相交的情况,问有多少种连接方案这个问题并不难,首先我们固定一个点,让它与另外的任意一个点连接,那么这个圆将被分成两份,我们暂且把这条线称为分界线,而两边各有一些点。我们可以很容易的发现,如果一边的点的个数为奇数,那么这一边无论怎么连,都必将剩下一个点没有被连接,这个点一定要越过分界线,也就是一个会出现相交。由于一边是奇数个点,另一边也肯定是奇数个点,会出现相同的情况所以我们得到一个策略,分界线不能随便选,它一定要保证两边的点的个数均是偶数。 阅读全文
posted @ 2013-02-23 16:25 Titanium 阅读(1542) 评论(0) 推荐(0)
摘要:递推/*递推我们要怎么得到n呢,可以考虑n-1的情况,在n-1的情况下我们只需要再放一个2*1的方块即可接着可以考虑n-2的情况,我们可以放入一个2*2的方块即可,或者放入2个2*1的方块接着我们可以考虑n-3的情况,可以放入3个2*1,或者1个2*2和1个2*1,或者1个2*1和1个2*2然后会发现,这样子就重复,n-3的这些情况其实就是n-1和n-2加起来的情况所以可以n只决定于n-1和n-2,易知递推公式为dp[n]=dp[n-1]+2*dp[n-2]*/#include <cstdio>#include <cstring>#define LEN 1010#def 阅读全文
posted @ 2013-02-23 12:51 Titanium 阅读(340) 评论(0) 推荐(0)
摘要:递推题意:看题目中的列子就可以知道 ,当n为5时,可行的子集有{1,3,5},{2,4},{2,5},{1,4}1.子集中任意两个元素的差x要2<=x<=3。2.子集要尽可能的长,好像1,3,5,不能是1,3,因为还能加上5然后就是一个很简单的递推,按位递推即可,dp[i]表示用前i个数字能产生多少个子集(并且该子集中包含了第i个元素),那么对于dp[i]来说,决定它的是dp[i-2]和dp[i-3],有第i个元素的子集必定有第i-2个元素或第i-3个元素至于用递推或者记忆化搜索来写都是没问题的#include <cstdio>#include <cstring& 阅读全文
posted @ 2013-02-19 11:21 Titanium 阅读(408) 评论(1) 推荐(0)
摘要:递推参考:http://hi.baidu.com/gbr12345/item/b1686d3e4d2c5584b611db64题意:输入n要拼成一个3*n的矩形,现有无限的2*1的小矩形可以提供,能有多少种不同的拼凑方案这题一看就觉得是组合数字或者是递推,看了几下确定递推更好做。然后想了下怎么递推。1.就按照n从小到大来推,但是找不出什么规律。2.按照面积来递推,先凑出面积为2的,再面积为4,为6……然后对于3*n的面积是多少就直接输出即可,这种思想感觉非常接近了但是还是不行,因为处理不了重复的情况最后无奈看了解题报告,不过还是不知道原作者怎么想到的这个递推公式#include <cst 阅读全文
posted @ 2013-02-18 17:42 Titanium 阅读(242) 评论(0) 推荐(0)
摘要:递推题意:给出n和k,用k个数字(可以相同)使他们的和为n,问有多少种方案数,其中好像a+b,b+a这种算为两种方案,也就是考虑排列这个问题用递推来做,按位递推。dp[c][s]表示在利用c个数字的条件下相加得s的方案数dp[c][s]=dp[c-1][s]+dp[c-1][s-1]+dp[c-1][s-2]……dp[c-1][0]另外需要初始化无论多少位,相加和位0的话方案数是1,即全部为0,所以dp[c][0]=1另外当只有一个数字时要相加和为s,方案数也是1,即只能填s本身,dp[1][s]=1然后就可以开始递推了我是用记忆化搜索来写的#include <cstdio>#in 阅读全文
posted @ 2013-02-17 22:13 Titanium 阅读(244) 评论(0) 推荐(0)
摘要:递推题意:给出n和k,可用的数字为0,1,2……k,一共有n位数字,现在要求得到一种排列,相邻两个数字相差不超过1,问这种排列的个数占全排列总数的比列要得到全排列的个数就是(k+1)^n , 要得到这个特殊的排列个数用递推即可dp[j][i]=dp[j-1][i-1]+dp[j][i-1]+dp[j+1][i-1];dp[j][i]的意义为第i位数字填j有多少种可能,那么第i位填了j,第i-1必定只可能填j-1,j,j+1才能保证相邻两位差不超过1但主要j=0和j=k的情况另外dp数值要用double#include <cstdio>#include <cstring> 阅读全文
posted @ 2013-02-17 21:21 Titanium 阅读(951) 评论(0) 推荐(0)
摘要:题意:题目只有一个case,有16个球队,给出名字,并且下面一个16*16的矩阵,p[i][j]是一个二位的整数,表示i球队打败j球队的概率,p[i][j]+p[j][i]=100,下面16行输出球队名字并且后面一个百分率是该球队获得总冠军的概率DP递推或者记忆化搜索都可以设dp[i][left][right]表示i这个球队在第left到第right球队里面得到冠军的概率,所以最后需要的是dp[i][1][16]。一个球队要在当面的阶段得到冠军必须在之前得到冠军所以mid=(left+right)/2; i和j在[left,right]里面争夺冠军(例如i和j在1到16里面争夺冠军,也就是争夺 阅读全文
posted @ 2013-02-08 22:15 Titanium 阅读(359) 评论(0) 推荐(0)
摘要:数学递推(考查矩阵二分快速幂取模)参考:http://www.cnblogs.com/staginner/archive/2011/12/14/2288187.html输入n和M,简单来说就是要求f(n)%M,而f(n)=2*F(n)-1,F(n)为第n项费波那列数,所以问题转化为求F(n),由于n非常大n (0 <= n < 263-1)所以线性递推会超时,要用矩阵快速幂的方法初始化[F0,F1]=[0,1] , 要求[Fn,Fn+1][F0,F1] * |0 1| (n) = [Fn,Fn+1] (不考虑高精度) |1 1|用二分的方法求解|0 1| (n) ... 阅读全文
posted @ 2013-02-07 14:02 Titanium 阅读(383) 评论(0) 推荐(0)
摘要:组合数学,递推(Catalan number , 卡特兰数)题目:给n个数字,能构建成多少种二叉排序树。这个问题并不难,用递归的思想就能解决。当空树即n=0时方案数为1,当n=1时方案数同样为1。当n>=2时,我们把n个数按升序排列,如果我们选ai作为数树根,那么a1……ai-1必定在有子树,ai+1……an必定在左子树,左子树有i-1个元素,同样是排序二叉树,相当于问这个i-1个元素又能组成多少个二叉排序树,右子树有n-i个元素,同时是二叉排序树,相当于问这n-i个元素能组成多少个二叉排序树,方案数为两者相乘。对于每个ai作为树根的计算方法如上,而所有的ai都能作为树根,所以不能总结出 阅读全文
posted @ 2013-02-06 23:54 Titanium 阅读(563) 评论(1) 推荐(0)
摘要:数学题(组合数学 或者 DP递推都可以)题意就不说了比较好懂。这题如果按照题意去模拟着思考是很难解决的,我们换一种思维,抓住一个特殊条件,将问题进行转化。无论是组合数学的方法计算还是DP递推,都是转化问题后才进行的。我们看做有n个不同的盒子,很t个完全相同重量为1的球。按照题意,每个盒子的重量不能小于p,那么我们干脆先每个盒子都放p个小球。剩下m=t-n*p个小球。那么无论这m个小球怎么放都是符合要求的。所以问题就转化为,将m个完全相同的小球放在n个不同的盒子里,盒子内可以装一个或多个小球或者为空。组合数学:即便是“将m个完全相同的小球放在n个不同的盒子里,盒子内可以装一个或多个小球或者为空” 阅读全文
posted @ 2013-02-02 13:17 Titanium 阅读(410) 评论(0) 推荐(0)
摘要:数学递推(DP)题意:有n个人,身高各不相同排成一列。从前面 看过去能看到p个人,后后面看过去能看到r个人。矮的人会被高的人挡着看不到。问满足p,r的情况下,有多少种排列的可能。/*DPdp[i][j][k]表示队列中有i个人,从前面可以看到j个人,后面可以看到k个人有多少种可能策略:从空队列开始,往其中插入人,从最高到最低插入,每次插入有3种位置,一种在队首,则从前面看的人数会加1,一种在队尾,则从队尾看的人数会加1,一种在中间(已经有n人在队中,那么有n-1个插入位置),则从队首和队尾看的人数 都不会增加状态转移方程 dp[i][j][k]=dp[i-1][j-1][k]+dp[i-1][ 阅读全文
posted @ 2013-01-28 17:17 Titanium 阅读(258) 评论(0) 推荐(0)
摘要:数学题(找规律或者是递推)一个大饼,切n刀,大饼最多能被分成几分(每份大小可以不一样)其实只要在纸上画几个出来就能找到规律了。用文字来描述的话就是,在已经切了n刀的情况下而且是最优的,切第n+1刀怎么切还能最优呢?就要第n+1刀能和之前的n刀全部相交。递推公式为 f[0]=1; f[n]=f[n-1]+n (n>=1); 两者结合得 f[n]=(n*n+n)/2+1 (n>=0);#include <cstdio>#include <cstring>long long n;int main(){ while(scanf("%lld",&a 阅读全文
posted @ 2013-01-23 11:56 Titanium 阅读(217) 评论(0) 推荐(0)