NYOJ252-01串-(数位dp)

252-01串


内存限制:64MB 时间限制:1000ms 特判: No
通过数:33 提交数:49 难度:2

题目描述:

ACM的zyc在研究01串,他知道某一01串的长度,但他想知道不含有“11”子串的这种长度的01串共有多少个,他希望你能帮帮他。

注:01串的长度为2时,有3种:00,01,10。

输入描述:

第一行有一个整数n(0<n<=100),表示有n组测试数据;
随后有n行,每行有一个整数m(2<=m<=40),表示01串的长度;

输出描述:

输出不含有“11”子串的这种长度的01串共有多少个,占一行。

样例输入:

2
2
3

样例输出:

3
5
#include<cstring>
#include<algorithm>
#include<stdio.h>
#include<iostream>
#define ll long long
#define inf 0x3f3f3f3f
using namespace std;

ll dp[45][2];///dp[i][j]表示第i位,以j开头的 符合条件的 01串有多少个 

int main()
{    
    memset(dp,0,sizeof(dp));
    dp[1][0]=dp[1][1]=0;
    dp[2][0]=2;
    dp[2][1]=1;
    for(int i=3;i<=40;i++)
    {
        dp[i][0]=dp[i-1][0]+dp[i-1][1];///以0开头后面什么都能加
        dp[i][1]=dp[i-1][0];///以1开头需要i-1位是0,往后的位的可能都包含在i-1位里,不用再加 
    }
    int t,n;
    cin>>t;
    while(t--)
    {
        cin>>n;
        printf("%lld\n",dp[n][1]+dp[n][0]);    
    } 
    return 0;
}
/*
0
1        
        
00
01
10
11
 
000
001
010
011
100
101
110
111 
*/

 

posted @ 2019-03-19 09:22  守林鸟  阅读(131)  评论(0编辑  收藏  举报