2011-06-10 21:12:27Morris
d837. NOIP2003 3.栈
http://zerojudge.tw/ShowProblem?problemid=d837
內容 :
栈是计算机中经典的数据结构,简单的说,栈就是限制在一端进行插入删除操作的线性表。
栈有两种最重要的操作,即pop(从栈顶弹出一个元素)和push(将一个元素进栈)。
栈的重要性不言自明,任何一门数据结构的课程都会介绍栈。宁宁同学在复习栈的基本概念时,想到了一个书上没有讲过的问题,而他自己无法给出答案,所以需要你的帮忙。
宁宁考虑的是这样一个问题:一个操作数序列,从1,2,一直到n(图示为1到3的情况),栈A的深度大于n。
现在可以进行两种操作,
1.将一个数,从操作数序列的头端移到栈的头端(对应数据结构栈的push操作)
2. 将一个数,从栈的头端移到输出序列的尾端(对应数据结构栈的pop操作)
使用这两种操作,由一个操作数序列就可以得到一系列的输出序列,下图所示为由1 2 3生成序列2 3 1的过程。(原始状态如上图所示)
你的程序将对给定的n,计算并输出由操作数序列1,2,…,n经过操作可能得到的输出序列的总数。
輸入說明
:
输入文件只含一个整数n(1≤n≤18)
輸出說明
:
输出文件只有一行,即可能输出序列的总数目
範例輸入 :
3
範例輸出 :
5
提示
:
出處
:
NOIP2003普及组第三题
(管理:liouzhou_101)
作法 : DP
你把可能性畫出來,會發現
前一個數字的"位置",跟即將要放的數字有關,不能放在前一個數字的前前面
如果不是這樣的話,那麼這種方法必不成立,請自行思考
作法 : DP
你把可能性畫出來,會發現
前一個數字的"位置",跟即將要放的數字有關,不能放在前一個數字的前前面
如果不是這樣的話,那麼這種方法必不成立,請自行思考
/**********************************************************************************/
/* Problem: d837 "NOIP2003 3.栈" from NOIP2003普及组第三题 */
/* Language: C */
/* Result: AC (2ms, 264KB) on ZeroJudge */
/* Author: morris1028 at 2011-06-09 22:07:13 */
/**********************************************************************************/
#include<stdio.h>
main() {
int DP[19][19] = {}, a, b, c, n;
int Ans[19]= {};
Ans[1] = 1, DP[1][1] = 1;
for(a = 1; a < 18; a++) {
for(b = 1; b <= a; b++)
for(c = 1; c <= b+1; c++)
DP[a+1][c] += DP[a][b], Ans[a+1] += DP[a][b];
}
while(scanf("%d", &n) == 1) {
printf("%d\n", Ans[n]);
}
return 0;
}