2 条题解

  • 4
    @ 2021-8-27 18:21:47

    在我的个人博客中阅读

    题面

    题意

    给出一个长度为 nn 的序列 SSSS 单调递增,问你有多少个序列 TT 以满足下列条件:

    1. TTSS 的一个排列。
    2. i=1nmin(Si, Ti)=k\sum_{i=1}^{n} \min(S_i,~T_i) = k

    1k2500, 1n50, 1Si501 \le k \le 2500,~1 \le n \le 50,~1 \le S_i \le 50

    分析

    我们发现 kk 的值非常小,所以我们考虑使用类似背包的方法考虑每一个 SiS_iTiT_i 对总答案的贡献。

    由于 SS 单调递增所以 SS 中的数互不相同,因此我们可以直接考虑分类讨论值 SiS_iTT 中的位置,令 Tj=SiT_j = S_i 则:

    1. j<ij < iSj<Si=TjS_j < S_i = T_j,因此 SiS_i 对答案产生 00 的贡献。
    2. j=ij = iSj=Si=TjS_j = S_i = T_j,因此 SiS_i 对答案产生 SiS_i 的贡献。
    3. j>ij > iSj>Si=TjS_j > S_i = T_j,因此 SiS_i 对答案产生 SiS_i 的贡献。

    计算答案的问题解决了,但是如何记录 SiS_iTT 中的位置?显然我们只关心 jjii 的大小关系,并不关心 jj 的具体值。因此我们只需要知道有多少中情况满足 j<ij < ij=ij = ij>ij > i 即可。

    考虑使用 DP 解决此问题,f[i][j][k]f[i][j][k] 表示已考虑 S1SiS_1 \sim S_i 部分,T1TiT_1 \sim T_i 中有 jj 个位置尚未确定值,且 S1SiS_1 \sim S_i 部分对总答案的贡献为 kk 的方案数。转移时枚举 jjii 的大小关系和 TiT_i 是否确定值即可。TiT_i 不确定值时即意味 TiT_i 将用 >Si> S_i 的数填充,TiT_i 确定值时即意味 TiT_i 将用 Si\le S_i 的数填充。

    具体转移见代码,建议手画几个图细心分析。

    代码

    View on GitHub

    信息

    ID
    189
    时间
    1000ms
    内存
    256MiB
    难度
    9
    标签
    递交数
    46
    已通过
    3
    上传者