题目名称 | 4178. 排列 |
---|---|
输入输出 | changgao_perm.in/out |
难度等级 | ★★☆ |
时间限制 | 1000 ms (1 s) |
内存限制 | 512 MiB |
测试数据 | 20 |
题目来源 |
|
开放分组 | 全部用户 |
提交状态 | |
分类标签 | |
分享题解 |
通过:0, 提交:0, 通过率:0% | |||
本题关联比赛 | |||
20251001国庆欢乐赛2 |
关于 排列 的近10条评论(全部评论) | ||||
---|---|---|---|---|
先来考虑一个排列可到达的条件是什么。
如果不是 n 排列,而是 01 序列的话,那么条件是显然的:只要对于任意 i,序列 b 的 第 i 个 1 都位于序列 a 的第 i 个 1 的右边(不一定严格),那么 a 就可以到达 b。 对于一个 n 排列 a,以及一个数 k,把 a 中大于 k 的数标为 1,剩下的数标为 0, 就能得 到一个 01 序列。如果对于任意的 k,排列 a 对应的 01 序列都能够到达排列 b 对 应的序列,那么排列 a 就可以到达排列 b。 它的必要性是显然的。至于充分性,可以观察下面这个移动策略: i 从 n 到 1 的顺 序,每次将数字 i 移到它的目标位置,令当前位置为 l,目标位置为 r,当前 (l, r] 区间的 最大数字为 a[j],那么把 a[l] 和 a[j] 交换一下即可。 容易看出这样移动一定是可行的。 那么只要做一个 01 串 DP: F[i][j]表示到第 i 位,已经用了的集合为 j 的方案数,从一个全 0 的串开始,每次转移 是枚举第 i 位放几,即将串中的某个 0 改为 1,最后到达一个全 1 的串,且保证经过的都 是合法 01 串。
2025-10-04 15:11
1楼
|
4 2 4 1 3
8
2019.2.21