随笔分类 -  组合数

摘要:题意:有来自n个专业的学生,每个专业分别有ai个同学,现在要将这些学生排成一行,使得相邻的两个学生来自不同的专业,问有多少种不同的安排方案。分析:首先将所有专业的学生视作一样的,最后再乘以各自学生的数量的阶乘。排列的时候通过动态规划来处理,设状态为前i个系,一共有j个位置相邻位置来自同系,然后转移。具体见代码注释。#include #include #include #include #include using namespace std;typedef long long LL;const LL mod = (int)(1e9)+7;LL A[50];LL C[500][500]; LL 阅读全文
posted @ 2013-11-11 22:52 沐阳 阅读(1074) 评论(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) 编辑
摘要:#include <cstring>#include <cstdio>#include <cstdlib>#include <algorithm>using namespace std;/*该题给定一个N,那么在有1.2.3...N个数字的情况下,这些数字高低交替进行排列把所有符合情况的进行一个字典序排列,问第C个排列是一个怎样的排列up[i][j]代表长度为i,第一位为j且后面需跟着一个上升数字的方案总数dn[i][j]代表长度为i,第一位为j且后面需跟着一个下降数字的方案总数根据我们所定义的状态,我们能够得到一个状态的转移关系(用来状态转移来 阅读全文
posted @ 2013-01-10 14:27 沐阳 阅读(353) 评论(0) 推荐(0) 编辑
摘要:阅读http://blog.csdn.net/niuxianzhuo/article/details/8285854后,深有感触。代码如下:#include <cstdlib>#include <cstdio>#include <cstring>using namespace std;const int MOD = 2012;/* 给定一个边长为偶数个(N)方格组成的正方形 现在由内到外每一个四边形为一层,每个方格 由0,1组成,现在要求是不同层之间不能够有 两个1相邻,现在给定N,问多少种情况 这里有一个很巧妙的转化,即是将我们关心的 相同层的关系转化为不 阅读全文
posted @ 2012-12-13 15:12 沐阳 阅读(500) 评论(0) 推荐(0) 编辑
摘要:这题的想法就是直接枚举1-m每一个数的数量,先给这n个数全排列,然后除以相同的数的阶乘就可以了。枚举的方法就是dfs了。这里分了两步来完成这个任务,首先找出前k个数的组合,然后再进行任意的组合。代码如下:#include <cstdlib>#include <cstdio>#include <cstring>#include <iostream>using namespace std;// 对于一个给定的m面色子,我们抛掷n次,前k大的数相加为p // 错误的思路为枚举最大的k个数,然后再将剩下的n-k个小于// 前k个数中最小的数进行排列组合/ 阅读全文
posted @ 2012-12-09 20:39 沐阳 阅读(264) 评论(0) 推荐(0) 编辑
摘要:注意输出结果也是在32位无符号内就可以了。代码如下:#include <cstdlib>#include <cstring>#include <cstdio>#include <algorithm>using namespace std;typedef long long Int64;Int64 C(Int64 a, Int64 b) { Int64 ret = 1; for (int i = 0; i < a; ++i) { ret *= (b-i); ret /= (i+1); } return ret;}int main() { .. 阅读全文
posted @ 2012-09-12 07:40 沐阳 阅读(186) 评论(0) 推荐(0) 编辑
摘要:直接用DP方程直接TLE了,因为数据范围达到了10^9......这题的正解是先用DP方程分别求出在t步走到每一行(列)的可能,再将其相加到一个步数为t的数组中,表示到第t步时,所有行(列)的种数,最后再用一个组合公式,将规定的K步进行分解来求得最后的答案。这题要特别要注意边界条件,还有就是防止溢出。这里用到了一个公式来求组合数 C[i, j] = C[i-1, j] + C[i-1, j-1]。代码如下:#include <cstdlib>#include <cstdio>#include <cstring>#define MOD 1000000007us 阅读全文
posted @ 2012-07-17 11:05 沐阳 阅读(233) 评论(0) 推荐(0) 编辑
摘要:排列2Time Limit: 1000/1000 MS (Java/Others)Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1438Accepted Submission(s): 535Problem DescriptionRay又对数字的列产生了兴趣:现有四张卡片,用这四张卡片能排列出很多不同的4位数,要求按从小到大的顺序输出这些4位数。Input每组数据占一行,代表四张卡片上的数字(0<=数字<=9),如果四张卡片都是0,则输入结束。Output对每组卡片按从小到大的顺序输出所有能由这四张卡片组成 阅读全文
posted @ 2011-07-09 21:00 沐阳 阅读(1711) 评论(0) 推荐(1) 编辑

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