集训Day1-DP初入

DP

LGP1772

简要题意: 给定无向带权图(\(m\)\(e\) 边),一共有 \(n\) 天,其中每天都有若干点不能走,与前一天路径不同将增加 \(k\) 代价,求 \(n\) 天总代价(总路径长度+额外代价),\(n\le 100,m\le 20, e\le 200\)

一句话题解: DP。考虑维护 \(i\sim j\) 天代价 \(cost_{i,j}\),维护前 \(i\) 天最小代价 \(f_i=\min_{0\le j< i}(f_j+cost_{j+1,i}\cdot(i-j)+k)\),表示从 \(j+1\) 天到第 \(i\) 天路径相同的代价。部分细节需特判。

CF1312E

简要题意: 给定长度 \(n\) 序列 \(a\) ,若 \(a_i=a_{i+1}\),那么可以合并两数为 \(a_i+1\),求最终最短长度。\(n\le 500\)

一句话题解: 先设计区间DP数组 \(f_{i,j}\) 为区间 \([i,j]\) 最终合成数(一定不超过一种),时间 \(\Theta(n^3)\)。然后再DP求解最少段数,\(\Theta(n^2)\)

分析:\(b_i=2^{a_i}\),那么合并操作就是 \(2^{a_i}+2^{a_{i+1}}=2^{a_i+1}\),在 \(b\) 上表现为加法。加法有固定答案。

CF1485F

简要题意:

解法1: 发现操作序列可以如此与合法 \(a\) 满足双射:我们设 \(f_{i,0/1}\),转移为

\[f_{i,0}=f_{i-1,0}+f_{i-1,1}\\ f_{i,1}=f_{i-1,0}+f_{i-1,1}-\texttt{Wrong}\\ \]

详细地,\(\texttt{Wrong}=cnt_{S_i-1}\)\(cnt\)map维护,每次对 \(cnt_{S_j}\) 加上 \(f_{j,1}\)\(S\)\(b\) 的前缀和

解法2: 对于前 \(i\) 个数,维护方案数 \(f_k\)\(k\) 是当前 \(a\) 的前缀和

  1. 复制操作,让 \(f'_{k+b_i}=f_k\)
  2. 求和操作,让 \(f'_{b_i}=\sum_{k=-\infty}^{\infty} f_{k}\)
  3. 去重:\(b_{i+1}=a_{i+1}=\sum_{j=1}^{i+1} a_j\),此时 \(k=0\),应不转移/撤销复制操作。

发现操作1可以直接用全局位移的形式,直接转移。剩下两个在位移后计算。范围极大,使用map等数据结构维护。

CF1209E2

只有前 \(n\) 个最大值所在列有贡献。把图缩成 \(n\times n\)

若我们放宽限制,使 \(r_i\) 是第 \(i\) 行随便选,发现答案与原问题等价。

\(S\) 是已经选出的 \(r_i\)\(i\) 的集合。

枚举 \(\bar S\) 子集 \(T\),使 \(f_{i,S}:=f_{i+1,S\mid T}+g_T\)\(g_S\) 为集合 \(S\) 对应的 \(r_i\) 最大值。

总结: 去除无用状态、放宽限制且仍等价

CF1215E

简要题意: 给定长度 \(n\) 序列 \(a\),求最小相邻交换次数,使相同值连续。\(n\le 4\cdot 10^5,1\le a_i\le 20\)

首先,交换次数等价于求逆序对对数。

\(f_S\) 为权值集合 \(S\) 的最小答案,\(g_{x,S}\) 表示满足 \(a_i = x,a_j \in S,i < j\) 的 (i,j) 个数

那么,有

\[f_S+g_{x,S}\to f_{S\cup \{x\}} \]

计算 \(g\) 可以用 \(w_{x,y}\) 表示 \(a_i=x,a_j=y,i<j\)\((i,j)\) 对数。则 \(g_{x,S}=g_{x,S/ \{y\}}+w_{x,y},y\in S\)

CF626F

简要题意: 给定 \(n\) 个数,求分组方案数,满足每个组内最大值与最小值之差的总和小于 \(k\),对 \(10^9+7\) 取模。

因为不需要有序,先对序列排序,使得从小到大,便于处理差。

考虑DP,设计状态为 \(f_{i,j,k}\),表示前 \(i\) 个数,有 \(j\) 个可以接着分组(未确定),当前总代价为 \(k\)

不能直接考虑,因为第三维有可能到达极大/极小值炸空间。

发现 \(a_r-a_l=\sum_{i=l}^{r-1} (a_{i+1}-a_i)\)。所以可以拆贡献。

因为有 \(j\) 个组的极差拆除了这个相邻差,所以代价 \(d=j\cdot (a_i-a_{i-1})\)

分类讨论,当前为 \(f_{i,j,k}\) 时有四种情况:

  • 添新组,可以继续分:\(f_{i,j,k}\to f_{i+1,j+1,k+d}\)
  • 添新组,不可以继续分:\(f_{i,j,k}\to f_{i+1,j,k+d}\)
  • 直接插入,可以继续分:\(j\cdot f_{i,j,k}\to f_{i+1,j,k+d}\)
  • 直接插入,不可以继续分:\(j\cdot f_{i,j,k}\to f_{i+1,j-1,k+d}\)

CF632E

简洁题意: \(n\) 个物体,均有价值 \(v_i\),问刚好 \(k\) 个物体总价值可能数量。重点:\(\Theta(n^3)\) 可以通过本题。

容易构造状态 \(f_i\) 表示直到当前,取到 \(i\) 价值的最小所需价值。但这样我们这样无法确定是否能刚好取到 \(k\) 个。

首先,如果有价值为0的物品,那我们就可以构造让所有物体数量小于 \(k\) 的方案合法(补0)。我们可以将每一个数减去最小值来构造0,然后将状态中的价值乘上 \(k\cdot min\),便是答案。

posted @ 2026-08-09 21:37  c_haoc  阅读(4)  评论(0)    收藏  举报