您的位置:首页 > 其它

POJ 1953 解题报告

2015-06-13 00:51 417 查看
这道题是简单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];

可以先打表,再输出。

thestoryofsnow1953Accepted168K0MSC++
/*
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
);
printf("\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: