算法设计与分析: 2-13 标准二维表问题

本文探讨了2*n的标准二维表问题,通过一维数组递归遍历、进栈出栈法以及Catalan数法进行求解。特别是,将问题转化为进栈出栈问题,利用Catalan数的递推关系进行计算,对于大数情况,使用大数乘法与除法来解决。文章提供了相关算法的Java实现及输入输出示例。
摘要由CSDN通过智能技术生成

2-13 标准二维表问题


问题描述

设n是一个正整数。2*n的标准二维表是由正整数1,2,…,2n组成的2*n数组,该数组的每行从左到右递增,每列从上到下递增。2*n的标准二维表全体记为Tab(n)。例如,当n=3时,tab(3)二维表如下图所示。

1 2 3
4 5 6
1 2 4
3 5 6
1 2 5
3 4 6
1 3 4
2 5 6
1 3 5
2 4 6

给定正整数n,试计算Tab(n)中2*n的标准二维表的个数。


分析

一维数组递归遍历法

将上面标准二维表从左到右从上往下看成一维数组,递归遍历,记录符合条件的情况。

进栈出栈法

1 2 3
4 5 6
1 2 3 4 5 6
0 0 0 1 1 1

如上图,先把2*n个数字排成一行来看(1~2*n 有序)。之前上表中放到第一行的数字1,2,3在下表中标记为0,放到第二行的数字4,5,6在下表中标记为1,这样就可以有一个0,1的序列,如下图(按照上面方式,将前面n=3时的所有5种标准二维表转变为一维表):

1 2 3
4 5 6
1 2 3 4 5 6
0 0 0 1 1 1
1 2 4
3 5 6
1 2 3 4 5 6
0 0 1 0 1 1
1 2 5
3 4 6
1 2 3 4 5 6
0 0 1 1 0 1
1 3 4
2 5 6
1 2 3 4 5 6
0 1 0 0 1 1
1 3 5
2 4 6
1 2 3 4 5 6
0 1 0 1 0 1

当n=3时,5种标准二维表转化成的总表如下

1 2 3 4 5 6
0 0 0 1 1 1
0 0 1 0 1 1
0 0 1 1 0 1
0 1 0 0 1 1
0 1 0 1 0 1

可见,题目要求前面的数字比后面、上面的数字比下面的数字小的问题,可以转化为,序列中每个数字前面0的个数要大于等于1的个数问题。

该问题又可以转换成进栈出栈问题。2*n个数字,进栈是0,出栈是1,且进栈出栈次数均为n,这样就可以保证输出的进栈出栈序列中每个数字前面0的个数大于等于1的个数,符合题目要求。

Catalan数法

上面方法中涉及到的 进栈出栈问题 本质上属于 Catalan数问题。因此,又可以转化为 Catalan数问题。

令h(0)=1,h(1)=1,Catalan数满足递推式[1] :
h(n)=h(0)h(n1)+h(1)h(n2)+...+h(n1)h(0)(n>=2)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值