您的位置:首页 > 其它

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

2015-02-23 22:09 260 查看
题意:

知道某一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一句:其实找规律不难发现答案其实就是斐波那契数列。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: