NOIP2024集训Day24 DP常见模型3 - 区间

NOIP集训Day24 DP常见模型3 - 区间

A. [CF1572C] Paint

\(f_{i, j}\) 表示区间 \([i, j]\) 涂成一种颜色的最小染色次数。可以发现对于区间 \([i, j]\),一定有一个最优方案使得整个区间最后染色成 \(a_j\)

证明: \(j\) 在区间 \([i, j]\) 的边缘,一定存在一个 \(k\in [i, j - 1]\),使得先将 \([k, j - 1]\) 染成一个个颜色,然后将 \([k, j]\) 统一颜色,再将 \([i, j]\) 统一颜色。如果 \([k, j - 1]\) 按照一种最优方案染完色后与 \(a_j\) 的颜色不同,则要使整个区间颜色相同,只要让 \(j\) 或者 \([k, j - 1]\) 整体变颜色,而无论变成什么颜色,必然使用一次染色,故选择将区间 \([k, j]\) 染成 \(a_j\),同理,将 \([i, k - 1]\)\([k, j]\) 颜色统一时,都将他们染成 \(a_j\) 也是不劣的。

所以将 \(f_{i, j}\) 重新定义为:将 \([i, j]\) 涂成 \(a_j\) 时的最小染色次数。

则有转移:\(f_{i, j} = \min(f_{i, j - 1} + [a_{j - 1}\ne a_j],\min\limits_{i + 1\le k \le j - 2} (f_{i, k} + f_{k + 1, j} + [a_k \ne a_j]))\)\(f_{i, i} = 0\)

时间复杂度 \(\Theta(n^3)\),显然 TLE。

题目中还有一句话:每种颜色最多出现 \(20\) 次。

进一步考虑,对于 \([i, j]\) 中的决策点 \(k\),总存在一个决策点有 \(a_k = a_j\) 的性质。

证明:将 \([i, j]\) 划分成若干个小区间 \([i, k_1], [k_1 + 1, k_2],\dots,[k_m + 1, j]\),显然这些区间合并时不需要额外使用一次染色,而若再将其中国的一个区间拆开作为决策点,那么会少一次将左半部分染成 \(a_j\) 的操作,多一次将决策点左右两部分颜色统一的染色操作,所以这样做是不劣的。所以,在枚举 \(k\) 时,只需枚举 \(a_k = a_j\) 的那一部分就好了。

时间复杂度 \(\Theta(20\times n^2)\)


B. [ABC219H] Candles

和昨天的甲虫这道题比较像。核心思想还是费用提前计算

我们需要知道想要吹熄的蜡烛数量才能计算当前行动一步带来的总长度损失。由于 \(n\) 比较小,可以直接把这一信息计入状态。

加入一只 \(x_{n + 1} = p_{n + 1} = 0\) 的蜡烛,设排序后该蜡烛的位置为 \(p\)

\(f_{l, r, 0/1, k}\) 表示当前经过了区间 \([l, r]\) 内的蜡烛并且停留在 \(l\) 或者 \(r\),还希望在这个区间外获得 \(k\) 根蜡烛。通过忽略“蜡烛长度非负”这一限制,把最大化最大值转化成最大化任意值,dp 求解。

时间复杂度 \(\Theta (n^3)\)


C. [HAOI2016] 字符合并

区间 dp。

\(f_{i, j, s}\) 表示区间 \([i, j]\) 合并后状态为 \(s\) 的最大值。

长度 \(\mod k = 1\) 的区间都可以合并成一个字符,那么转移枚举的中点每次可以跳 \(k - 1\) 步,\(s = 2^{(j - i) \mod (k - 1)}\),当 \((k - 1) | s\) 的时候加上合并的贡献就可以了。


D. [AGC062B] Split and Insert

还是区间 dp。

首先把操作序列反转,于是问题就变成了:每次可以选出一个子序列放到序列末尾,使得序列升序的最小代价。

\(f_{i, l, r}\) 为操作了 \(i\) 次,把 \([l, r]\) 排好序的最小代价

转移:

\(f_{i, l, r}\rightarrow f_{i + 1, l, r}\)

\(f_{i, l, q} + f_{i, q + 1, r} + c_{k - i + 1} \times (r - q) \rightarrow f_{i + 1, l, r}\)

时间复杂度 \(O(n^3k)\)

posted @ 2024-09-06 10:33  Leirt_Abu  阅读(29)  评论(0)    收藏  举报