DP入门50题(2)——NYoj252 01串

来源:互联网 发布:怎么订购淘宝视频服务 编辑:程序博客网 时间:2024/05/20 05:58

题意:
知道某一01串的长度,但他想知道不含有“11”子串的这种长度的01串共有多少个,他希望你能帮帮他。
注:01串的长度为2时,有3种:00,01,10。

思路:
从长度为2开始考虑,有00,01,10三种;
长度为3,有000,001,010,101,100五种;
长度为4,有0000,0001,0010,1010,0101,1001,1000,0100八种
。。。。。。
找规律,dp[i][0]代表以0为结尾的01串
dp[i][1]代表以1为结尾的01串
则不难发现:
dp[2][0] = 2; dp[2][1]=1;
dp[3][0] = dp[2][0]+dp[2][1]=3; dp[3][1]=dp[2][0] = 2;
dp[4][0] = dp[3][0]+dp[3][1]=5; dp[4][1]=dp[3][0] = 3;
……
那每一种长度i的01串总和就是dp[i][0]+dp[i][1];
dp[i][0]=dp[i-1][0]+dp[i-1][1];
dp[i][1]=dp[i-1][0];
也就是dp公式了。

代码

#include <iostream>#include <cstdio>#include <cstring>#include <string>#include <algorithm>using namespace std;int main(int argc, char *argv[]){    cin.tie(false);    ios::sync_with_stdio(false);    long long n,a[200][2];    a[2][0] = 2;    a[2][1] = 1;    for(int i = 3 ; i < 41 ; i++)    {        a[i][0] = a[i-1][1]+a[i-1][0];        a[i][1] = a[i-1][0];    }    #ifdef H_R        freopen("in.txt","r",stdin);    #endif // H_R    while( cin >> n )    {        int t;        while(n--)        {            cin >> t;            cout << a[t][0] + a[t][1] << endl;        }    }    return 0;}

PS一句:其实找规律不难发现答案其实就是斐波那契数列。。。

0 0