题目背景

栈是计算机中经典的数据结构,简单的说,栈就是限制在一端进行插入删除操作的线性表。

栈有两种最重要的操作,即pop(从栈顶弹出一个元素)和push(将一个元素进栈)。

栈的重要性不言自明,任何一门数据结构的课程都会介绍栈。宁宁同学在复习栈的基本概念时,想到了一个书上没有讲过的问题,而他自己无法给出答案,所以需要你的帮忙。

题目描述

宁宁考虑的是这样一个问题:一个操作数序列,从1,2,一直到n(图示为1到3的情况),栈A的深度大于n。

现在可以进行两种操作,

1.将一个数,从操作数序列的头端移到栈的头端(对应数据结构栈的push操作)

  1. 将一个数,从栈的头端移到输出序列的尾端(对应数据结构栈的pop操作)

使用这两种操作,由一个操作数序列就可以得到一系列的输出序列,下图所示为由1 2 3生成序列2 3 1的过程。

(原始状态如上图所示)

你的程序将对给定的n,计算并输出由操作数序列1,2,…,n经过操作可能得到的输出序列的总数。

输入输出格式

输入格式:

输入文件只含一个整数n(1≤n≤18)

输出格式:

输出文件只有一行,即可能输出序列的总数目

输入输出样例

输入样例#1:

3
输出样例#1:

5

这题是个裸的卡特兰数
但是也可以用dp做,
用dp[i][j]表示i个在栈里,j个在栈外的方案数
转移方程:
dp[j][i]=max(dp[j][i],dp[j-1][i]+dp[j+1][i-1])
 #include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
int read(int & n)
{
char p='+';int x=;
while(p<''||p>'')
p=getchar();
while(p>=''&&p<='')
x=x*+p-,p=getchar();
n=x;
}
int dp[][];
int main()
{
int ans=;
int n;read(n);
for(int i=;i<=n;i++)
{
for(int j=;j<=n;j++)
{
if(i==)
dp[j][]=;
else if(j==)
dp[][i]=dp[][i-];
else
dp[j][i]=max(dp[j][i],dp[j-][i]+dp[j+][i-]);
}
}
cout<<dp[][n];
return ;
}

最新文章

  1. C#自定义控件属性显示在属性面板中操作
  2. False 等效值
  3. kubernetes学习笔记1
  4. linux 学习网站
  5. PHP时间格式控制符对照表
  6. 关于java线程池 Ⅱ
  7. Ie浏览器TextBox文本未居中
  8. 【翻译】CSS水平和垂直居中的12种方法
  9. javaMybatis映射属性,高级映射
  10. PHP网站常见安全漏洞,及相应防范措施总结
  11. 实现Map接口(hash原理)
  12. 关于阿里云Centos7 Mailx发送邮件失败的处理
  13. racket安装
  14. &#39;假定以下程序经编译和连接后生成可执行文件PROG.EXE,如果在此可执行文件所在目录的DOS提示符下键入:PROG ABCDEFGH IJKL&lt;回车&gt;,则输出结果为( ). void main( int argc, char *argv[]) { while(--argc&gt;0) cout&lt;&lt;argv[argc]; cout&lt;&lt;&quot;\n&quot;; }
  15. Linux跨服务器发送文件
  16. 注册Docker官网账号 注册按钮不能点
  17. python 全栈开发,Day80(博客系统分析,博客主页展示)
  18. leetcode338&mdash;Counting Bits
  19. Strategy Pattern ava设计模式之策略模式
  20. HF Reader

热门文章

  1. paramiko错误信息:Paramiko error: size mismatch in put
  2. C#代码读写XML
  3. Windows Server 2012关机的几种方法
  4. 【Android归纳】回调机制在Android中的应用与实战
  5. 使用HTML5监測站点性能
  6. PB MD5
  7. Map-produce算法两个开源实现
  8. cocos2dx 纹理优化
  9. [计算机故障]excel无法存盘,总是自动重启恢复
  10. (转)web会话管理方式