#jSDPlydlt50x5C04. 装饰围栏 A Decorative Fence
装饰围栏 A Decorative Fence
好的,我将这个题目整理成适合算法平台的形式,包含题目描述、输入输出格式、样例及详细解释。
题目描述
有 块木板,长度分别为 ,宽度均为 。
现要用这些木板拼成一个宽度为 的围栏,使得围栏中相邻的木板高低交错,即每块木板两侧的木板要么都比它高,要么都比它低。
对于围栏中的一块木板:
- 如果两侧的木板都比它低,则称它处于高位;
- 如果两侧的木板都比它高,则称它处于低位;
- 对于左右两端的木板,只需考虑它唯一的一侧。
将所有满足条件的围栏方案,按字典序排序(按照木板长度从左到右构成的序列排序)。
现在给定整数 ,求排名为 (从 开始计数)的围栏序列是什么。
输入格式
第一行一个整数 ,表示数据组数。
接下来 行,每行两个整数 。
输出格式
每组数据输出一行,表示排名为 的围栏序列,木板长度用空格隔开。
数据范围
保证 不超过合法围栏的总数。
输入样例
2
2 1
3 3
输出样例
1 2
2 3 1
样例解释
的情况
所有可能的围栏(满足高低交错):
1 2:第一块木板 1 在低位(右侧 2 比它高),第二块木板 2 在高位(左侧 1 比它低)。2 1:第一块木板 2 在高位(右侧 1 比它低),第二块木板 1 在低位(左侧 2 比它高)。
按字典序排序:
1 22 1
排名第 1 的序列是 1 2,所以输出 1 2。
的情况
所有合法围栏(按字典序排列):
1 3 22 1 32 3 13 1 23 2 1
排名第 3 的序列是 2 3 1,所以输出 2 3 1。
思路提示(不要求输出)
此类问题属于带限制条件的排列计数与排名计算,可以用动态规划预处理:
- 设 表示用 个不同的木板(长度 1 到 ),第一块木板在剩余木板中按高度排名第 位(即从小到大第 小),且第一块木板处于低位(0)或高位(1)时的方案数。
- 利用递推关系可以由小规模推到大规模,然后从高位到低位确定每块木板。