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];
可以先打表,再输出。
我们可以递推地求所有的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 ); printf("\n"); } return 0; }
相关文章推荐
- python之图形界面
- python之文件和素材
- 约书亚树的启示
- python之标准库
- sqlserver存储过程及易错点
- JS(JavaScript)脚本库的积累
- python之特殊方法、属性和迭代器
- Contains Duplicate III
- python之异常
- 用Maven构建Hadoop项目
- python之抽象二
- 用MATLAB發EMAIL以及給全北大同學群發EMAIL呵呵呵
- python之抽象一
- 互联网秒杀设计
- 互联网秒杀设计
- 百度地图(二)基础地图Hello BaiduMap
- python之条件-循环和其他语句
- 秒杀多线程
- lua学习笔记(2)——内核入口
- android List,HashMap,Iterator