https://vjudge.net/problem/POJ-1953
题意:
输入一个n,这n位数只由0和1组成,并且不能两个1相邻。计算共有多少种排列方法。
思路:
递推题。
首先a[1]=2,a[2]=3是显而易见的,接下来计算分析到第n位时的排列方法数,如果第n-1位数为1,那么第n位只能为0,那么此时有g[n-1]种方法(g[n-1]表示第n-1位为1的数量)。如果第n-1位为0,那么此时有2*f[n-1]种方法(f[n-1]表示第n-1位为0的数量)。
所以,两者相加=g[n-1]+2*f[n-1]=a[n-1]+f[n-1]=a[n-1]+a[n-2]。(n-1位为0说明n-2既可以为0,又可以为1,所以f[n-1]=a[n-2])。
1 #include<iostream> 2 using namespace std; 3 4 const int maxn = 50; 5 6 int n; 7 int a[maxn]; 8 9 void init() 10 { 11 a[1] = 2; 12 a[2] = 3; 13 for (int i = 3; i <= 50; i++) 14 { 15 a[i] = a[i - 1] + a[i - 2]; 16 } 17 } 18 19 int main() 20 { 21 //freopen("D:\txt.txt", "r", stdin); 22 int T; 23 scanf("%d", &T); 24 init(); 25 for (int kase = 1; kase <= T; kase++) 26 { 27 scanf("%d", &n); 28 printf("Scenario #%d: %d ", kase, a[n]); 29 } 30 }