【题目描述】
有一些装有铀(U)和铅(L)的盒子,要求把N个盒子放成一行,但至少有3个U放在一起,询问有多少种放置方案。
【输入描述】
输入一个整数N。
【输出描述】
输出一个整数,表示方案数。
【样例输入】
样例1:
4
样例2:
5
【样例输出】
样例1:
3
样例2:
8
【数据范围及提示】
对于100%的数据,3 <= N <= 30。
样例1:
UUUL、LUUU、UUUU。
样例2:
UUUUL、UUUUU、UUULU、UUULL、LUUUU、LUUUL、ULUUU、LLUUU。
源代码: #include<cstdio> int n,num,f[31]={0}; int main() { scanf("%d",&n); f[3]=1; num=1; for (int a=4;a<=n;a++) { f[a]=2*f[a-1]+num-f[a-4]; num=num<<1; } printf("%d",f[n]); return 0; } /* 挺妙的一道题: N个箱子无非有以下两种情况: (1)去掉第一个箱子后依然符合条件,则剩余的N-1个箱子有f[N-1]种排列方案数。 (2)去掉第一个箱子后不符合条件,则第2、3、4个箱子一定是U、U、L,则剩余的N-4个箱子有2^(N-4)-f[N-4]种排列方案数。 综上所述,则状态转移方程为: f[a]=2*f[a-1]+2^(a-4)-f[a-4]。 */