HDU 2563 统计问题(递推)
2015-08-14 21:07
351 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2563
将向上移的步数设为a
,将向左右移的步数设为b
,有a
=a[n-1]+b[n-1],因为之前一步是向哪个方向,上移只有向上一个方向;b
=a[n-1]*2+b[n-1],因为之前一步若向上移,则接下来就有左右两个方向都可以移动,若之前向左或右,则这一步只能按照原来的方向移(原来的路已经坍陷)。
得到走n步的方案有f
=a
+b
,又由a
和b
的递推公式得到f
=f[n-1]*2+a[n-1],又b
=a
+a[n-1],最终推得f
=2*f[n-1]+f[n-2],那么代码就很容易了~
将向上移的步数设为a
,将向左右移的步数设为b
,有a
=a[n-1]+b[n-1],因为之前一步是向哪个方向,上移只有向上一个方向;b
=a[n-1]*2+b[n-1],因为之前一步若向上移,则接下来就有左右两个方向都可以移动,若之前向左或右,则这一步只能按照原来的方向移(原来的路已经坍陷)。
得到走n步的方案有f
=a
+b
,又由a
和b
的递推公式得到f
=f[n-1]*2+a[n-1],又b
=a
+a[n-1],最终推得f
=2*f[n-1]+f[n-2],那么代码就很容易了~
#include<cstdio> #include<iostream> #include<sstream> #include<cstdlib> #include<cstring> #include<string> #include<climits> #include<cmath> #include<algorithm> #include<queue> #include<vector> #include<stack> #include<set> #include<map> using namespace std; int f[25]; int main() { int c,n; scanf("%d",&c); while(c--) { f[1]=3; f[2]=7; for(int i=3; i<=20; i++) f[i]=2*f[i-1]+f[i-2]; scanf("%d",&n); printf("%d\n",f ); } return 0; }
相关文章推荐
- Html5+移动端小应用分享(得见)
- ReentrantReadWriteLock实现
- nyoj 14 会场安排问题
- SQLServer With As 用法
- 129. Sum Root to Leaf Numbers
- JavaScript类型检测汇总
- 添加多盟SDK 库函数
- JDBC入门try/catch型
- 【bugfree】安装
- 用dfs序维护树结构
- 【 LightOJ - 1094】Farthest Nodes in a Tree(求树的直径)链式向前星 + DFS or BFS
- 为什么我还不推荐内存中OLTP给用户
- python菜鸟日记7
- UVALive 5840 数学题
- ASP入门(十)-Session对象
- win10和office2013激活
- 黑马程序员 多线程
- 继承与base
- 一个测试 unix 时间戳的程序
- 《算法导论》第一讲