首页 > 技术文章 > 2825 codevs危险的组合(递推)

zzyh 2017-03-29 11:26 原文

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

【代码】

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstdlib>
 4 #include<cmath>
 5 using namespace std;
 6 int n;
 7 int num(int x)
 8 {
 9     if(x<3)return 0;
10     if(x==3)return 1;
11     if(x==4)return 3;
12     return 2*num(x-1)+pow(2,x-4)-num(x-4); 
13 }
14 int main()
15 {
16     scanf("%d",&n);
17     printf("%d",num(n));
18     return 0;
19 }

 

推荐阅读