摘要:
递推参考:http://hi.baidu.com/gbr12345/item/b1686d3e4d2c5584b611db64题意:输入n要拼成一个3*n的矩形,现有无限的2*1的小矩形可以提供,能有多少种不同的拼凑方案这题一看就觉得是组合数字或者是递推,看了几下确定递推更好做。然后想了下怎么递推。1.就按照n从小到大来推,但是找不出什么规律。2.按照面积来递推,先凑出面积为2的,再面积为4,为6……然后对于3*n的面积是多少就直接输出即可,这种思想感觉非常接近了但是还是不行,因为处理不了重复的情况最后无奈看了解题报告,不过还是不知道原作者怎么想到的这个递推公式#include <cst 阅读全文
摘要:
递推题意:给出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 阅读全文
摘要:
递推题意:给出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> 阅读全文
摘要:
题意:题目只有一个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里面争夺冠军,也就是争夺 阅读全文
摘要:
概率题给你p和q,表示概率p/q,当有n个红袜子,m个黑袜子时,取两次,两次都是红袜子的概率为p/q,输出n和m,如果不可能则输出impossible设总袜子数为b,红袜子数为a,则a/b*(a-1)/(b-1)=p/q , 可见分子p是a*(a-1)的形式,分母q也是这种形式所以我们用暴力来枚举i*(i-1)分母,并且当分子也能写成j*(j+1)的形式时就找到了解其实这题意义不大也不是什么经典题,能AC也就行了不必太抠#include <cstdio>#include <cmath>long long gcd(long long a , long long b){ r 阅读全文
摘要:
数学递推(考查矩阵二分快速幂取模)参考: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) ... 阅读全文
摘要:
资料来源百度百科http://baike.baidu.com/view/2499752.htm卡特兰数又称卡塔兰数,是组合数学中一个常出现在各种计数问题中出现的数列。由以比利时的数学家欧仁·查理·卡塔兰 (1814–1894)命名。卡特兰数前几项为 : 1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 208012, 742900, 2674440, 9694845, 35357670, 129644790, 477638700, 1767263190, 6564120420, 24466267020, 9148 阅读全文
摘要:
组合数学,递推(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都能作为树根,所以不能总结出 阅读全文
摘要:
//概率题//先求出每一次中,抽到两个红球的概率为pi,qi=1-pi,表示每一次中不是抽到两个红球的概率//pi=(1/i)*(1/(i+1))=1/(i*i+i)//题目要求所有抽取中,至少有一次抽到两个红球的概率//我们算出所有抽取中,每次都没有抽到两个红球的概率Q=(q1*q2*q3……qn),则1-Q为所求答案//另外要求出,每一次都抽到两个红球的概率,即P=(p1*p2*p3……pn)//但P这个数值必定非常小,所以题目只需要输出P小数点后有多少个连续的0//我们来分析P这个数字,令P=10^a,易知a是个负数,令a=i+d,i为整数部分,d为小时部分//则P=10^i*10^d, 阅读全文
摘要:
DP(DAG最长路)题意:给出x轴上的线段的端点坐标,一个线段能覆盖另一个线段(端点不能相同),求出最多的线段覆盖并且从短到长给出路径。转化模型为DAG,求DAG上的最长路并且打印路径,用记忆化搜索实现#include <cstdio>#include <cstring>#define N 550int a[N],b[N],n;bool g[N][N];int dp[N],path[N];void dfs(int i){ if(dp[i]!=-1) return ; dp[i]=1; for(int j=1; j<=n; j++) if(g[i][j]) { .. 阅读全文