2825 危险的组合

时间限制: 1 s
空间限制: 64000 KB
题目等级 : 钻石 Diamond
题目描述 Description

有一些装有铀(用U表示)和铅(用L表示)的盒子,数量均足够多。要求把N个盒子放成一行,但至少有3个U放在一起,有多少种方法?

输入描述 Input Description

包含一个整数N

输出描述 Output Description

输出一个整数表示方法数。

样例输入 Sample Input

样例1:4

样例2:5

样例输出 Sample Output

样例1:3

样例2:8

数据范围及提示 Data Size & Hint

对于100%的数据(3<=N<=30)

样例1解释:

UUUL、LUUU、UUUU

样例2解释:

UUUUL、UUUUU、UUULU、UUULL、LUUUU、LUUUL、ULUUU、LLUUU

【思路】

当加入第n个的时候有两种情况(1 )前面的n-1个已经满足了,而第n个要么是u要么是l,所以这这情况有 2*num(n-1)种

当加入第n个的时候,前面的n-1种没有满足情况,所以n-1个前面几个排列一定是 uul。。。 所以在前面加入一个u正好满足要求 就是UUUl...(第一个u是新加的 )

而后面n-4个一共的情况(包括三个u没有挨在一起的)pow(2,n-4)种情况,再减去num(n-4)(也就是减去n-4个排列满足三个u在一起的情况,因为我们现在是找n-1个不满足的情况)。

就推出递推式了  做出来了  爽QWQ

【代码】

 #include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
using namespace std;
int n;
int num(int x)
{
if(x<)return ;
if(x==)return ;
if(x==)return ;
return *num(x-)+pow(,x-)-num(x-);
}
int main()
{
scanf("%d",&n);
printf("%d",num(n));
return ;
}
05-11 15:20