题目链接:http://poj.org/problem?id=1953
Hint:
题意是给定一个小于45的整数n,求n位2进制数中不含相邻1的数的个数。
本题如果没有参考过其他资料的话,也不能算是一道简单题。
给定一个小于45的整数n,求n位2进制数中不含相邻1的数的个数。看似简单的一道题,如果当n=45时, 对
2的45次方检查,是无法完成的任务。先分析一下这个问题。
对n=1来说,以对1结尾、以0结尾个数都是1,总和是2;对于所有以1结尾的数,后面都可以加上0,变为n=2
时以0结尾的,而只有结尾为0的数才能加上1(因为不能有两个连续1),这样n=2时,以1结尾的个数是上一个
n以0结尾的数的个数,以0结尾的个数是上一个n以1结尾的个数加上以0结尾的个数。即分别为1、2,以此类推,
我们可以算出所有n<=45的值,然后根据输入进行相应输出。
代码如下:
#include<iostream>
#include<fstream>
#include<vector>
#include<string>
#include<map>
#include<iterator>
#include<algorithm>
#include<numeric>
#include<cmath>
#include<sstream>
using namespace std;
long long f[21][21][21];
int main()
{
#ifdef ONLINE_JUDGE
#else
freopen("D:\\in.txt", "r", stdin);
freopen("D:\\out.txt", "w", stdout);
#endif // ONLINE_JUDEG
int d[50][2];
d[1][0] = 1;
d[1][1] = 1;
for (int i = 2; i <= 45; i++)
{
d[i][0] = d[i - 1][0] + d[i-1][1];
d[i][1] = d[i - 1][0];
}
int n(0);
cin >> n;
int num(0);
for (int i = 0; i < n;i++)
{
cin >> num;
cout << "Scenario #" << i + 1 << ":" << endl;
cout << d[num][0] + d[num][1] << endl;
cout << endl;
}
return 0;
}