题意不是很容易读懂,大意是这样的:
给一个n位的二进制数,求它有多少种不包含连续的一的排列,例如 n = 3时,有5种排列 ( 000, 001, 010, 100, 101)(011, 110, 111 中有连续的1所以不满足).。
思路:
我们先填n位二进制数的第一位,第一位有两种情况,1或0,当第一位为0时,这个n位数的排列数与其后的n-1位排列数相同,当第一位为1时,第二位一定为0(因为不能有连续的1),所以这个n位数的排列,与其后n-2 位数排列相同
所以我们可以得到一个公式 f(n)=f(n-1)+f(n-2)。即斐波拉契数列
有了这个公式我们很容易得到程序。不过需要注意的是,这道题用递归的方法会超时
代码:
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
int f[50];
int main(){
int t,x;
f[1]=2;f[2]=3;
for(int i=3;i<50;i++){
f[i]=f[i-1]+f[i-2];
}
cin>>t;
for(int i=1;i<=t;i++){
scanf("%d",&x);
printf("Scenario #%d:\n%d\n\n",i,f[x]);
}
return 0;
}