0
点赞
收藏
分享

微信扫一扫

P1595 信封问题

爱喝酒的幸福人 2022-04-14 阅读 22
算法

知识点:

(1)全排列,假设一共有n个人,则有n的阶乘的排列方式。(n)!

(2)圆排列,将n个人排在圆桌上一共有几种排列方式。(n-1)!

        圆排列与全排列的区别在于,圆排列一种排列方式,并且从一个固定的点打开,每次顺时针 

        旋转一个点,旋转n次回出现n种结果,但是对于圆排列来说只是一种结果。按照这样的方式

        不断地拆分会成为全排列。因此圆排列的排列方式一共具有n的阶乘除以n个。即有(n-1)!的排         列方式。

(3)卡特兰数

卡特兰数递推式

55分代码

#include<iostream>
#include<cstdio>

using namespace std;

typedef long long ll;

const int mas=20;
bool v[mas];//代表信件
ll res;
int n;

void dfs(int x)//第几个信封
{
    if(x==n+1){
    	res++;
       return ;
    }
    
    for(int i=1;i<=n;i++)
    {
        if(!v[i]&&i!=x)
        {
			 v[i]=true;
			dfs(x+1);
		    v[i]=false; 
		}     
    }
 
    return ;
}
int main()
{
    scanf("%d",&n);
    dfs(1);
    printf("%lld",res);
    return 0;
}

100分代码

#include<iostream>
#include<cstdio>

using namespace std;

typedef long long ll;

int n;

ll dfs(int x)
{
    if(x==1||x==0)return 0;
    if(x==2)return 1;
    return (dfs(x-1)+dfs(x-2))*(x-1);
}
int main()
{
    scanf("%d",&n);
    printf("%lld",dfs(n));
    return 0;
}
举报

相关推荐

0 条评论