| 题目名称 | 4178. 排列 |
|---|---|
| 输入输出 | changgao_perm.in/out |
| 难度等级 | ★★☆ |
| 时间限制 | 1000 ms (1 s) |
| 内存限制 | 512 MiB |
| 测试数据 | 20 |
| 题目来源 |
|
| 开放分组 | 全部用户 |
| 提交状态 | |
| 分类标签 | |
| 分享题解 |
| 通过:7, 提交:18, 通过率:38.89% | ||||
|
|
100 | 0.499 s | 7.12 MiB | C++ |
|
|
100 | 0.598 s | 5.41 MiB | C++ |
|
|
100 | 0.927 s | 11.55 MiB | C++ |
|
|
100 | 0.950 s | 7.64 MiB | C++ |
|
|
100 | 0.973 s | 7.81 MiB | C++ |
|
|
100 | 1.143 s | 5.29 MiB | C++ |
|
|
100 | 1.617 s | 5.33 MiB | C++ |
|
|
90 | 6.393 s | 5.33 MiB | C++ |
|
|
90 | 6.644 s | 5.29 MiB | C++ |
|
|
90 | 6.869 s | 5.26 MiB | C++ |
| 本题关联比赛 | |||
| 国庆欢乐赛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