Sync solutions from hanyixuanten/luogu@d8022d4
1 parent
155881a274
commit
4365fa9fd9
2 files changed
+17
No files matched your search
+16
@@ -0,0 +1,16 @@
|
|||||||
|
# P3205 [HNOI2010] 合唱队 题解
|
||||||
|
|
||||||
|
题意插入 $n$ 个数,对于每个数,若大于上一个则放右边,否则放左边。求有多少种插入序列,使得最后排列与给定序列相同。
|
||||||
|
|
||||||
|
考虑区间 dp,设 $f_{i, j}$ 表示区间 $[l, r]$ 且最后一次插入从左边的方案数,$g_{i, j}$ 表示区间 $[l, r]$ 且最后一次插入从右边的方案数。则:
|
||||||
|
|
||||||
|
$$
|
||||||
|
\begin{aligned}
|
||||||
|
f_{i, j} =& f_{l + 1, r} * (a_l < a_{l + 1}) + g_{l + 1, r} * (a_l < a_r) \\
|
||||||
|
g_{i, j} =& f_{l, r - 1} * (a_l < a_r) + g_{l, r - 1} * (a_{r - 1} < a_r)
|
||||||
|
\end{aligned}
|
||||||
|
$$
|
||||||
|
|
||||||
|
转移即可。注意 $f_{i, i}, g_{i, i}$ 只有一个能够设为 $1$,否则会重复计算。
|
||||||
|
|
||||||
|
[code](../P3205.cpp)
|
||||||
+1
@@ -16,5 +16,6 @@
|
|||||||
- [[P2016|P2016]]
|
- [[P2016|P2016]]
|
||||||
- [[P2607|P2607]]
|
- [[P2607|P2607]]
|
||||||
- [[P3199|P3199]]
|
- [[P3199|P3199]]
|
||||||
|
- [[P3205|P3205]]
|
||||||
- [[P3572|P3572]]
|
- [[P3572|P3572]]
|
||||||
- [[P6650|P6650]]
|
- [[P6650|P6650]]
|
||||||
Reference in new issue
Block a user