3016

Problem P

Time Limit : 3000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other)
Total Submission(s) : 51   Accepted Submission(s) : 29

Problem Description

在一无限大的二维平面中,我们做如下假设:<br>1、&nbsp;&nbsp;每次只能移动一格;<br>2、&nbsp;&nbsp;不能向后走(假设你的目的地是“向上”,那么你可以向左走,可以向右走,也可以向上走,但是不可以向下走);<br>3、&nbsp;&nbsp;走过的格子立即塌陷无法再走第二次;<br><br>求走n步不同的方案数(2种走法只要有一步不一样,即被认为是不同的方案)。<br>

Input

首先给出一个正整数C,表示有C组测试数据<br>接下来的C行,每行包含一个整数n (n<=20),表示要走n步。<br>

Output

请编程输出走n步的不同方案总数;<br>每组的输出占一行。<br>

Sample Input

2
1
2

Sample Output

3
7

题意:

每次可以走一步两步三步,不能后退;求走N步的总方案数;

思路:

设f[n]为第n步的方案,a[n]为向上走的方案,b[n]为向左右走的方案

易得f[n]=a[n]+b[n];

而上一步不管是向哪里走,这一步都可以向上走,所以a[n]=a[n-1]+b[n-1]=f[n-1];

如果上一步向左走,那么这步除了向上就只能向左走,所以本来b[n]=2*(a[n-1]+b[n-1]),但少了左右的一种情况,要减去b[n-1],所以b[n]=2*a[n-1]+b[n-1];

把上面两个式子带入f[n]得

f[i]=2*(a[n-1]+b[n-1])+a[n-1]=2*f[n-1]+f[n-2];

AC代码:

#include <stdio.h>

#define N 21

int fr[N],fu[N];///分别表示最后一步的方向 水平、竖直

int main()

{

fr[1] = 2;

fu[1] = 1;

int i;

for(i = 2; i < N; ++i)

{

fu[i] = fu[i - 1] + fr[i - 1] ;

fr[i] = (fu[i - 1]<<1) + fr[i - 1];

}

int t;

scanf("%d",&t);

while(t --)

{

scanf("%d",&i);

printf("%d\n", fu[i] + fr[i]);

}

return 0;

}

时间: 2024-11-09 00:18:06

3016的相关文章

poj 3016 K-Monotonic 左偏树 + 贪心 + dp

//poj 3016 K-Monotonic//分析:与2005年集训队论文黄源河提到的题目类似,给定序列a,求一序列b,b不减,且sigma(abs(ai-bi))最小.//思路:去除左偏树(大根堆)一半的节点(向上取整),让左偏树的根节点上存放中位数:每个左偏树的根节点表示一个等值区间//在本题中,我们将一段区间 与 一颗左偏树等同:将求调整给定数列 vi 为不减序列的代价 与 求取数列 bi 等同 1 #include"iostream" 2 #include"cstd

hdu 3016 Man Down (线段树 + dp)

题目大意: 是男人就下一般层...没什么可以多说的吧. 注意只能垂直下落. 思路分析: 后面求最大值的过程很容易想到是一个dp的过程 . 因为每一个plane 都只能从左边 从右边下两种状态. 然后我们所需要处理的问题就是 ,你如何能快速知道往左边下到哪里,往右边下到哪里. 这就是线段树的预处理. 讲线段按照高度排序. 然后按照高度从小到大加入到树中. 然后去寻找左端点 和 右端点最近覆盖的线段的编号. #include <cstdio> #include <iostream> #

HDU 3016 Man Down(线段树)

HDU 3016 Man Down 题目链接 题意:是男人就下100层的游戏的简单版,每次仅仅能从两端下落.求落地最大血量 思路:利用线段树能够处理出每一个线段能来自哪几个线段.然后就是dag最长路了 代码: #include <cstdio> #include <cstring> #include <algorithm> #include <vector> using namespace std; const int N = 100005; int n;

3016: [Usaco2012 Nov]Clumsy Cows

3016: [Usaco2012 Nov]Clumsy Cows Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 91  Solved: 69[Submit][Status][Discuss] Description Bessie the cow is trying to type a balanced string of parentheses into her new laptop, but she is sufficiently clumsy

3016 质子撞击炮 II

3016 质子撞击炮 II 时间限制: 1 s 空间限制: 32000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Description [抱歉数据错误~~已修复] 欧盟简直是太贪心了.继完成与苏联的合作灭了尤里之后,继续与苏联交战.可惜的是,在这期间,传说中的小日本(旭日帝国·升阳帝国)居然强大起来了.盟军重新与苏联合作,准备歼灭日本.在小爱(爱因斯坦)之后,不少盟军的杰出科学家合作发明了闪电风暴二代:质子撞击炮.它的好处就是冷却时间短,威力大.每当一次攻击过后,五发质

【HDOJ】3016 Man Down

线段树+spfa求最长路.逆向思维,从最底下一块板子建图.需要注意的是任何一个板子掉落下面再无板子,此时都可以看做一个终结状态. 1 /* 3016 */ 2 #include <iostream> 3 #include <string> 4 #include <map> 5 #include <queue> 6 #include <set> 7 #include <stack> 8 #include <vector> 9

HDU 3016 Man Down 线段树+简单DP

囧,一开始看错题意,后来才发现人是垂直下落的,被附带链接里的Man Down游戏误导了. 那就变成了一个简单的DAG模型动态规划,随意搞就ok了 #include <cstdio> #include <cstring> #include <iostream> #include <map> #include <set> #include <vector> #include <string> #include <queu

COJ 3016 WZJ的图论问题

传送门:http://oj.cnuschool.org.cn/oj/home/problem.htm?problemID=1046 试题描述: WZJ又有一个问题想问问大家.WZJ用数据生成器生成了一个虚拟旅游区.这个旅游区由N个城市构成,标号从1到N,这些城市之间由M条双向道路连接.其中每个城市有一个游乐场,游客可以花costi的钱数去城市i的游乐场玩,并获得happyi的高兴值,但对于一个游乐场,游客只能去玩至多一次.因为虚拟旅游区的内存有限,有时候WZJ被迫在系统中删去一些边,当然WZJ可

【BZOJ】3016: [Usaco2012 Nov]Clumsy Cows 贪心 单调栈

Description Bessie the cow is trying to type a balanced string of parentheses into her new laptop, but she is sufficiently clumsy (due to her large hooves) that she keeps mis-typing characters. Please help her by computing the minimum number of chara

hdu(3016) Man Down(线段树查询更新+dp)

这道题目可以说是游戏的简化版. 题目的大致意思是: 首先我们只有两种板,一种使能量增加,另一种却使能量减少. 最开始人物站在最高层,然后它一开始有100的生命值,它每次下落只能掉到离他最近的木板上去,当然他只能从左端点或者是右端点往下掉. 但是如果没有板满足如下情况的话,那么他就掉到最底下去了,如果此时他的能量小于等于0的话,那么他就会死亡,那么则输出-1:否则输出他所能获得能量的最大值. 现在的任务是叫你输出最大所能获得最大能量值. 思路: 1)我们要找到当前区间的分别从左右端点下去离他最近的