【洛谷p1044】栈(全排列+栈的压入弹出序列)(卡特兰数)

题目背景

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

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

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

题目描述

【洛谷p1044】栈(全排列+栈的压入弹出序列)(卡特兰数)_第1张图片

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

现在可以进行两种操作,

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

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

【洛谷p1044】栈(全排列+栈的压入弹出序列)(卡特兰数)_第2张图片

(原始状态如上图所示)

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

输入格式

输入文件只含一个整数 nn(1 \leq n \leq 181≤n≤18)。

输出格式

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

我的做法:思路是对的,但是复杂度太高了。最后两个样例超时了。(希望有志之士帮我优化一下)

【洛谷p1044】栈(全排列+栈的压入弹出序列)(卡特兰数)_第3张图片

import java.util.*;
public class Main{
    static void swap(int [] array,int i,int j){
        int temp = array[i];
        array[i] = array[j];
        array[j] = temp;
    }
    static ArrayList list = new ArrayList<>();
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int[] array = new int[n];
        for(int i = 0;i stack = new Stack<>();
        int j = 0;
        for(int i = 0;i

卡特兰数:

import java.util.*;
public class Main{
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int [] array = new int[n+1];
        array[0] = 1;
        for(int i = 1;i<=n;i++){
            for(int j = 0;j

 

你可能感兴趣的:(洛谷,算法)