1 条题解

  • 0
    @ 2025-8-24 22:29:39

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar Unordered_OIer
    **

    搬运于2025-08-24 22:29:39,当前版本为作者最后更新于2021-03-06 19:56:29,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    P7414 题解

    不是,USACO 恶意撞题怎么回事啊/yiw

    Description

    有一个长度为 nn 的初始值均为 00 的序列 aa,每次操作可以将其中一个子段统一改成任意值。

    现给定一个长度为 nn 的目标序列 bb,求最少操作几次可以达到这个目标序列。

    Solution

    dpdp 显然。

    考虑设 f[i][j]f[i][j] 表示刷完区间 [i,j][i,j] 至少需要多少次。

    假设当前决策到 i,ji,j,分类讨论:

    • bibjb_i \neq b_j,则考虑枚举一个分段点 kk,依次转移即可,即:
    f[i][j]=mink=ij1f[i][k]+f[k+1][j]f[i][j]=\min\limits_{k=i}^{j-1}f[i][k]+f[k+1][j]
    • bi=bjb_i=b_j,则容易得到 f[i][j]f[i+1][j]f[i][j] \geq f[i+1][j],并且观察到 f[i+1][j]f[i+1][j] 的任意一种方案都会适合 f[i][j]f[i][j],延申一个底盘即可,因此 f[i][j]f[i+1][j]f[i][j] \leq f[i+1][j]
      综上,得到 f[i][j]=f[i+1][j]f[i][j]=f[i+1][j],但是因为左右延申都是可以的,所以 f[i][j]=min(f[i+1][j],f[i][j1])f[i][j]=\min(f[i+1][j],f[i][j-1]),即:
    f[i][j]=min(f[i+1][j],f[i][j1])f[i][j]=\min(f[i+1][j],f[i][j-1])

    所以通过讨论我们得到了转移方程:

    $$f[i][j]=\begin{cases}\min\limits_{k=i}^{j-1}f[i][k]+f[k+1][j]&b_i \neq b_j\\\min(f[i+1][j],f[i][j-1])&b_i=b_j\end{cases} $$

    初始化即为 f[i][j]={ij1i=jf[i][j]=\begin{cases}∞&i \neq j\\1&i=j\end{cases}

    转移即可,复杂度 O(n3)\mathcal O(n^3)

    • 1

    信息

    ID
    6540
    时间
    1000ms
    内存
    250MiB
    难度
    6
    标签
    递交数
    0
    已通过
    0
    上传者