NOIP2024集训Day36 DP优化
NOIP2024集训Day36 DP优化
A. [NOIP2023] 天天爱打卡
前段时间才看过这道题。dp + 线段树优化 + 离散化。经典。
考虑朴素 dp。定义 \(f_i\) 表示考虑到第 \(i\) 个位置,并钦定第 \(i\) 天跑步的最大能量值。
枚举最后一段跑步时间,有:\(f_i = \max(\max\limits_{k\lt j} f_k - (i - j) \times d + \sum\limits_{j\lt l_p \le r_p \le i} v_p)\)。
假设 \(g_i = \max\limits_{j\lt i} f_i\),参变分离,有:\(f_i = \max(g_j + j\times d + \sum\limits_{j\lt l_p \le r_p \le i} v_p) - i\times d\),
秩序维护前面的最大值即可。考虑线段树优化。
对于 \(g_j + j\times d\) 是定值,直接在线段树末尾插入即可。后面的部分可以在枚举的过程中不断把 \(r_p = i\) 的线段加入,也就是区间加。具体地说,对于每一个 \([l_i, r_i]\),给所有 \(j\lt l_i\) 加入 \(v_i\),表示若走满 \([j + 1, i]\) 可以取到该线段。
考虑优化。可以发现 \(f\) 序列会分成很多段。这些线段的左右端点把整个序列分为多段,观察每一段的决策,对于 \([l,r]\) 段,一定只有都跑和都不跑两种情况。考虑选每段的右端点作为该段的代表元。于是对于每个线段,我们只保留 \(l_i−1\) 与 \(r_i\) 两个端点即可,离散化完之后转移同样。
复杂度 \(\Theta(m\log m)\)。
B. [ABC201F] Insertion Sort
定义 \(f_i\) 表示需要的最小花费使得 \(\le i\) 的序列有序。
\(f_i = \min(\sum\limits_{j - 1}^{i - 1} \min(A_j, B_j), \min\limits_{j\lt i, pos_j \lt pos_i} (f_j + \sum\limits_{k = j + 1}^{i - 1} A_k))\)
\(\Theta(n^2)\),可以用树状数组和累加和优化到 \(\Theta(n\log n)\),最后通过 \(\min\limits_{1\le i\le N}(f_i + \sum\limits_{j = i + 1}^{N} \min(A_j, C_j))\) 获得答案。
C. [CF1481E] Sorting Books
关键在于:最小化移动次数相当于最大化不移动的书的数量。
这样就简单许多了。
定义每种书的区间为该种书最左边的书的位置到最右边的位置。
那么我们可以选择一些不相交的书,让他们不移动。可以倒着 dp 实现。
D. [AGC009C] Division into Two
先假定 \(A\le B\),然后判断无解。
如果 \(a_{i + 2} - a_i \le B\),无论怎么分配都是不合法的,直接判掉。
\(f_i\) 表示选了前 \(i\) 个数,其中第 \(i\) 个数是归为 \(A\) 集合的方案数。
可以发现,可转移的状态是一段区间。\(f_i\) 可以转移当且仅当 \(a_i - a_j \ge A\) 且 \(a_{j + 1}\) 到 \(a_{j - 1}\) 都可以被归到 \(B\) 集合。
使用前缀和优化,复杂度 \(\Theta(n)\)。

浙公网安备 33010602011771号