题目要求

P1044题目链接


分析

题意就是:N个数依次进栈,可随机出栈,算一下可能的出栈序列数。

其实这个就是Catalan啊,如果数据结构与算法有一定的刷题积累的学生应该经常做这样的About栈的题:

  • 下列出栈序列中可能的是()
  • 下列出栈序列中不可能的是()
  • 出栈的可能序列数是多少?

前两种你可以自己推一推,最后一种总不能乱猜吧?
而结论正是来源于此呢。

我比较菜,就学了大佬的Catalan解法做的题并简单写写题解。

建立int类型数组catalan。
catalan[i]表示i个数出栈的全部可能数。
先初始化两个值:catalan[0] = 1, catalan[1] = 1。
这是显然的,不解释。

设x为当前出栈序列的最后一个,则x有n种取值。

而由于x是最后一个出栈的,所以可以将已经出栈的数分成两部分:

  • 比x小
  • 比x大

比x小的数有x-1个,所以这些数的全部出栈可能为catalan[x-1];
比x大的数有N-x个,所以这些数的全部出栈可能为catalan[n-x]。

这两部分互相影响,所以一个x的取值能够得到的所有可能性为catalan[x-1] * catalan[n-x]

另外,由于x有n个取值,所以得到最终的式子:

catalan[n] = f[0] * f[n-1] + f[1] * f[n-2] + … + f[n-1] * f[0]

下面是核心算法的Java实现代码:

catalan[0] = 1;
catalan[1] = 1;
for (int i = 2; i <= num; i++) {for (int j = 0; j < i; j++) {catalan[i] += (catalan[j] * catalan[i-j-1]);}
}

最后推荐这位大佬的题解 → Here
dalao讲述了递归/记忆化搜索、递推/ DP (动态规划)、数论做法_卡特兰/ Catalan、高精度/打表这样四种解法,感兴趣的自行学习,这种大神级别的题解本蒟蒻还写不出来,只能Orz并推荐给大噶。

AC代码(Java语言描述)

import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int num = scanner.nextInt();scanner.close();int[] catalan = new int[num+1];catalan[0] = 1;catalan[1] = 1;for (int i = 2; i <= num; i++) {for (int j = 0; j < i; j++) {catalan[i] += (catalan[j] * catalan[i-j-1]);}}System.out.println(catalan[num]);}
}

[Catalan]求解随机出栈可能数(洛谷P1044题题解,Java语言描述)相关推荐

  1. 巧用TreeSet求解第k小整数(洛谷P1138题题解,Java语言描述)

    题目要求 P1138题目链接 分析 第K小整数应该是比较经典的问题啦,但我们也可以利用现成的数据结构去完成轻松处理. 既然还要去重,那不妨--嘿嘿嘿--TreeSet万岁!! 把元素全打进去就完成了去 ...

  2. 括号匹配不一定用栈哦(洛谷P1739题题解,Java语言描述)

    说明 有点标题党,严格地说,括号匹配用栈做比较规范. 问题是下面这题有点水啊,简便点大家都开心~~ 题目要求 P1739题目链接 分析 题目太水,所以说我们可以认为什么各种异常不会出现. 只需要--简 ...

  3. 动态规划求解疯狂的采药问题(洛谷P1616题题解,Java语言描述)

    题目要求 P1616题目链接 分析 参考这篇文章自己做出来的 → Here 我就不讲了. AC代码(Java语言描述) import java.util.Scanner;public class Ma ...

  4. 贪心 or 动态规划 求解“最大字段和”问题(洛谷P1115题题解,Java语言描述)

    题目要求 P1115题目链接 分析 练习DP,势在必行! 状态转移方程:f[i]=max(f[i−1]+n[i],n[i])f[i]=max(f[i-1]+n[i], n[i])f[i]=max(f[ ...

  5. 队列模拟约瑟夫问题(洛谷P1996题题解,Java语言描述)

    题目要求 P1996题目链接 分析 以前就研究过"约瑟夫环"问题: <单循环链表求解约瑟夫环问题(Java语言描述)> <杀人游戏~约瑟夫环(洛谷P1145题题解 ...

  6. 线性存储的最短平均检索时间(洛谷P1253题题解,Java语言描述)

    题目要求 P1253题目链接 分析 很像 ~洛谷P1223题题解~,也是一种类似SJF的贪心法. 排个序,由于两个不大于10000的数,乘起来还是int,就使用int属性吧. 数据量小,所以Scann ...

  7. 小A点菜(洛谷P1164题题解,Java语言描述)

    题目要求 题目链接 分析 用DPDPDP做是必然的,讲讲二维的吧: f[i][j]f[i][j]f[i][j]:用前iii道菜用光jjj元钱的可能组合数 剩下的钱等于第iii道菜的价格时,f[i][j ...

  8. 图书ISBN号码检验(洛谷P1055题题解,Java语言描述)

    题目要求 P1055题目链接 分析 分别将每个数值提出来,怎么分隔其实无所谓. 按照指定的规则算出来sum,然后sum%11得到末位. 一定要注意:末位10应该表示成X,这也是后面所有WA的根源-- ...

  9. 麦森数(洛谷P1045题题解,Java语言描述)

    题目要求 题目链接 分析 这题挺经典的,快速幂取模算法,如果求出大数再取模就可能T掉. 之前有篇文章写了这个算法:<快速幂算法详解&&快速幂取模算法详解> 既然是Java, ...

最新文章

  1. 【CTF】实验吧 古典密码
  2. Java多线程:synchronized关键字和Lock
  3. mysql多租户schema复制,Asp.net core下利用EF core实现从数据实现多租户(3): 按Schema分离 附加:EF Migration 操作...
  4. NIO的Buffer
  5. Leaflet中使用Leaflet-echarts3插件实现航班航线动态模拟
  6. sqlite 模糊匹配日期_sql模糊查询和根据日期筛选
  7. Springboot @Value获取配置文件中的值失效
  8. 先进的NumPy数据科学
  9. asp.net中RegularExpressionValidator控件中正则表达式用法
  10. 一文理解 K8s 容器网络虚拟化
  11. STM32H7时钟树RCC分析--- CubeMx配置(三)
  12. Web应用程序的目录结构
  13. luajit日记-配置说明
  14. C++ 单元测试框架 Boost Test BOOST_AUTO_TEST_CASE
  15. Ubuntu下安装Flask虚拟环境及使用
  16. PHP 数组获取最后一个值
  17. 个人网站 域名 购买 解析 备案
  18. 学计算机学生笔记本电脑实用,介绍四款适合学生党的笔记本电脑
  19. scrapy爬虫入门
  20. 1.认识童心派 — 电子胸牌

热门文章

  1. webpack之font-awesome
  2. BroadcastReceiver 广播机制详解
  3. 2012 依赖注入框架
  4. 蓝桥杯第八届省赛JAVA真题----日期问题
  5. 树--树的基本性质(JAVA)
  6. 怎么把jad反编译放到Eclipse中
  7. 单招计算机英语面试口语,单招面试英语自我介绍范文 自我介绍说什么
  8. 照片边框 app android,Screener App-一手搞定将手机截图加上外框
  9. 在互联网公司工作是种怎样的体验?
  10. 2020年中国基层医疗研究报告