牛客网算法学习笔记-排列组合

原创 2016年05月31日 12:01:58

在XxY的方格中,以左上角格子为起点,右下角格子为终点,每次只能向下走或者向右走,请问一共有多少种不同的走法

给定两个正整数int x,int y,请返回走法数目。保证x+y小于等于12。

测试样例:
2,2
返回:2
横向要走X-1步,纵向要走Y-1步,总共需要走,X+Y-2步,其中有X-1横向。C{x-1,x+y-2}
class Robot {
public:
    int countWays(int x, int y) {
        // write code here
        if(x==1&&y==1)
            return 0;
        
        return C(x-1,x+y-2);
    }
    
    int C(int m,int n){
        
        long a = n - m ;
        long result = 1;
        long temp1 = 1;
        long  temp2 = 1;
        for(int i = 1 ; i<=n;i++){
            result = result *i;
        }
        
        for(int i = 1;i<=m;i++){
            temp1 = temp1 * i;
        }
        
        for(int i = 1 ; i <=a;i++){
            temp2 = temp2 * i ;
        }
        return result/(temp1*temp2);
        
        
    }
};

n个人站队,他们的编号依次从1到n,要求编号为a的人必须在编号为b的人的左边,但不要求一定相邻,请问共有多少种排法?第二问如果要求a必须在b的左边,并且一定要相邻,请问一共有多少种排法?

给定人数n及两个人的编号ab,请返回一个两个元素的数组,其中两个元素依次为两个问题的答案。保证人数小于等于10。

测试样例:
7,1,2
返回:[2520,720]
第一个:所有的排列组合中一半a在b左边,一半a在b右边
第二个:将两个人看做一个整体,所以一共只有N-1个人的全排列
class StandInLine {
public:
    vector<int> getWays(int n, int a, int b) {
        // write code here
        int result1 = 1;
        for (int i = 1;i<=n;i++){
            result1 = result1 * i;
        }
        int result2 = 1;
        for(int i = 1;i<=n-1;i++){
            result2  = result2 * i;
        }
        vector<int> result;
        result.push_back(result1/2);
        result.push_back(result2);
        return result;
    }
};
9.4(思路比较模糊)

A(A也是他的编号)是一个孤傲的人,在一个n个人(其中编号依次为1到n)的队列中,他于其中的标号为b和标号c的人都有矛盾,所以他不会和他们站在相邻的位置。现在问你满足A的要求的对列有多少种?

给定人数n和三个人的标号A,bc,请返回所求答案,保证人数小于等于11且大于等于3。

测试样例:
6,1,2,3
288
用排除的方式,先将A放在最左边,AB相连的情况,再将A放在最右边,BA相连的情况,然后还有AC,CA。但是这种排列方式中会有A出现在中间的情况,那么就会重复减CAB,和BAC的情况,所以要加回来。
class LonelyA {
public:
    int getWays(int n, int A, int b, int c) {
        // write code here
        if(n==3)
            return 0;
        
        int result = 1;
        int part1 = 1;
        int part2 = 1;
        int minglePart = 1;
        for(int i = 1 ; i<=n;i++){
            result = result * i;
        }
        for(int i = 1;i<=n - 1;i++){
            part1 = part1 * i;
        }
        for(int i = 1;i<=n-1 ; i++){
            part2 = part2 *i;
        }
        for(int i = 1;i<=n-2; i++){
            minglePart = minglePart * i;
        }
        minglePart = minglePart * 2;
        result = result - 2*(part1 + part2) +minglePart;
        return result;
    }
};

n颗相同的糖果,分给m个人,每人至少一颗,问有多少种分法。

给定nm,请返回方案数,保证n小于等于12,且m小于等于n。

测试样例:
10,3
返回:36
class Distribution {
public:
    int getWays(int n, int m) {
        // write code here
        if(n==m)
            return 1;
        return C(n-1,m-1);
    }
    int C(int n ,int m){
        int result =1 ;
        int part1 = 1;
        int part2 = 1;
        for(int i =1 ;i<=n;i++){
            result = result * i;
        }
        
        for(int i =1 ;i<= (n-m);i++){
            part1 = part1 * i;
        }
        for(int i = 1; i<=m;i++){
            part2 = part2 *i;
        }
        return result/(part1*part2);
    }
};
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

积跬步至千里——算法强化训练(8)卡特兰数相关题目求解

卡特兰数:

牛客网算法学习笔记-卡特兰数相关

说实话,卡特兰数我自己基本没什么深刻的理解,只能做一些相关的简单的题目而已。所以这里只记录题目和代码。 n个数进出栈的顺序有多少种?假设栈的容量无限大。 给定一个整数n,请返回...

笔试算法学习--买票找零问题(卡特兰数)

问题:2n个人排队买票,其中n个人持50元,n个人持100元。每张票50元,且一人只买一张票。初始时售票处没有零钱找零。请问这2n个人一共有多少种排队顺序,不至于使售票处找不开钱? 题目另一种形式:...

【R语言学习笔记】探索ggplot的排列组合(一)

R里面最出名的就是ggplot作图包了,虽然现在如果利用R画图一般用自带包就可以,甚至很多图形可以直接拿excel做(为了匹配PPT),但是R中的plot类图形不是很美观,并且最大的问题是很多数据、图...

【R语言学习笔记】探索ggplot的排列组合:线图(一)

上一节探索了散点图,但是散点图好像可以编辑的点不多,排列组合也不太多;下面进行线图的探索1、 最简单的线图 还是借用mtcars的数据集:p<-ggplot(data=mtcars) p+geom_...

学习笔记---高等数学前置知识---数列、排列组合、解不等式

数列 等差(a1即首项,d即公差,n即项数) 通项公式: 前n项和公式:或 等比(a1即首项,q即公比,n即项数) 通项公式: 求和公式: 附: 裂项公式 常在计...

排列组合算法(非递归)

/************************  * 排列组合算法  * 非递归方式  *  * 编译器:borland c++  * 时间:2013-10-10  * 笔名:Jungle  * ...

Java排列组合算法

  • 2016-07-31 15:56
  • 95KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)