POJ 1953 World Cup Noise

题目链接: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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值