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公式了。
代码
PS一句:其实找规律不难发现答案其实就是斐波那契数列。。。
知道某一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一句:其实找规律不难发现答案其实就是斐波那契数列。。。
相关文章推荐
- DP入门50题(5)——NYoj 17 单调递增最长子序列
- NYOJ 252 01串(dp,递推)
- DP入门50题(4)——NYoj79 导弹拦截
- 长度串NYOJ 252 01串 dp
- NYOJ 252 01串(dp)
- NYOJ_252 01串问题
- nyoj 252 01串
- NYOJ-252 01串
- NYOJ 252 01串
- nyoj 01串 (DP)
- NYOJ 题目252 01串(动态规划,递推)
- DP入门50题(7)——NYoj37 回文字符串
- NYOJ_252_01串
- nyoj-252-01串
- NYoj 252 01串[简单动态规划+组合数+斐波那契数列]
- NYOJ252---01串
- NYOJ-252 01串
- nyoj-252-01串
- NYOJ252 01串
- DP入门50题(1) ——poj3176 数塔(详细、适合新手)