NYOJ 252 01串

01串

时间限制: 1000 ms  |  内存限制: 65535 KB
难度: 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


最开始的思路是计算结尾0,1的字符串数,如果是0,则加二位,否则加一位。

#include <iostream>
#include <deque>
using namespace std;

int main()
{
	int x;
	cin>>x;
	while(x--)
	{
		deque<int> deq;
		deque<int>::iterator it;
		int n,count_0,count_1;
		cin>>n;
		for(int i=0;i<n;i++)
		{
		    	count_0=0;
				count_1=0;
			if(deq.empty())
			{
				deq.push_front(0);
				deq.push_front(1);
			}
			else
			{
				for(it=deq.begin();it!=deq.end();it++)
				if(*it==0)
				count_0++;
				else
				count_1++;
				deq.clear();
				for(int i=0;i<count_0;i++)
				{
					deq.push_front(0);
				    deq.push_front(1);
				}
				for(int i=0;i<count_1;i++)
				{
					deq.push_front(0);
				}
				
			}
		}
		cout<<deq.size()<<endl;
		deq.clear();
	}
	return 0;
} 

显然运行超时了....


然后想到用递归:

思路:
     求长度为k的字符串中不含 ‘11’ 子串的字符串的个数dp[k],此时需要分两种情况:
 1)当第 k 位为 0 时,不含 ‘11’子串的个数为dp[k - 1];
    2)当第 k 位为 1 时,第 k - 1 位一定为 0, 则此时不含 ‘11’子串的个数为dp[k - 2];

#include <iostream>
#include <cstdio>

using namespace std;

int solve(int len)
{
    if(len == 2)
        return 3;
    else if(len == 3)
        return 5;
    else
        return solve(len - 1) + solve(len - 2);
}

int main()
{
    int T, len;
    scanf("%d", &T);
    while(T--)
    {
        scanf("%d", &len);
        printf("%d\n", solve(len));
    }
    return 0;
}
仍然运行超时....
 
    
 
    
用一个数组保存运行结果:
#include <iostream>
#include <cstdio>

using namespace std;

int dp[41];
    
void init()
{
    dp[2] = 3;
    dp[3] = 5;
    for(int i = 4; i <= 40; ++i)
        dp[i] = dp[i - 1] + dp[i - 2];
}

int main()
{
    int T, len;
    init();
    scanf("%d", &T);
    while(T--)
    {
        scanf("%d", &len);
        printf("%d\n", dp[len]);
    }
    return 0;
}

AC....
动态规划...


你可能感兴趣的:(NYOJ 252 01串)