这道题是简单DP题。用zeros[i]表示长度为i的“合法”序列以0开头的个数,同理ones[i]表示长度为i的合法序列以1开头的数目,而nums[i]表示长度为i的合法序列的数目,于是有nums[i] = zeros[i] + ones[i]。
我们可以递推地求所有的zeros和ones。从i - 1 到 i,由于0前面既可以加0,也可以加1,而1前面为避免出现连续的1只能加0,于是我们有:
zeros[i] = zeros[i - 1] + ones[i - 1];
ones[i] = zeros[i - 1];
可以先打表,再输出。
thestoryofsnow | 1953 | Accepted | 168K | 0MS | C++ |
/*
ID: thestor1
LANG: C++
TASK: poj1953
*/
#include <iostream>
#include <fstream>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <limits>
#include <string>
#include <vector>
#include <list>
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <algorithm>
#include <cassert>
using namespace std;
const int MAXN = 45;
int main()
{
int nums[MAXN], zeros[MAXN], ones[MAXN];
zeros[1] = 1, ones[1] = 1, nums[1] = 2;
for (int i = 2; i < MAXN; ++i)
{
zeros[i] = zeros[i - 1] + ones[i - 1];
ones[i] = zeros[i - 1];
nums[i] = zeros[i] + ones[i];
}
int T;
scanf("%d", &T);
for (int t = 0; t < T; ++t)
{
int n;
scanf("%d", &n);
assert(0 < n && n < MAXN);
printf("Scenario #%d:\n", t + 1);
printf("%d\n", nums[n]);
printf("\n");
}
return 0;
}