CF295D Greg and Caves 发布于 2021-06-28 3.61k 次阅读 题面 题意 问满足下列条件的 n×m 的 01 矩阵 a 的数量: ∃[l, r](1≤l≤r≤n),满足 ∀i∈[l, r], ∑jai,j=2 且 ∀i∉[l, r], ∑jai,j=0。 设 [l, r] 中的每一行的第一个值为 1 的位置的下标为 xi,第二个值为 1 的位置的下标为 yi,则:∃t∈[l, r],满足 ∀i∈[l, t−1], xi≥xi+1, yi≤yi+1 且 ∀i∈[t, r−1], xi≤xi+1, yi≥yi+1。 分析 考虑使用 DP 解决本题。 令 f[i][j] 表示考虑洞的前 i 行(该 i 行都在洞的中间位置 t 的上方)且第 i 行的 yi−xi+1=j 时该洞的构造方案(不考虑洞在矩阵中的摆放位置)。 考虑枚举第 i−1 行的长度以及与第 i 行的相对位置,得出转移方程: f[i][j]=∑t=0jf[i−1][t]×(j−t+1) 尝试使用该数据描述最终答案 Ans,考虑枚举中间位置 t 的行编号以及该行 yi−xi+1 的大小。同时由于可能存在构造洞的方案满足第 t 行与相邻的几行的形态完全相同,为了防止算重,考虑令 t 为洞的最大的满足 yi−xi+1 最大的行数,同时枚举 t+1 行的长度(小于 t 行长度),算出最终答案: Ans=∑i=1n∑a=0m−2(m−a−1)×(∑l=1if[i−l+1][a])×(1+∑b=0a−1(∑r=i+1nf[r−i][b])×(a−b+1))=∑i=1n∑a=0m−2(m−a−1)×(∑t=1if[t][a])×(1+∑b=0a−1(∑t=1n−if[t][b])×(a−b+1)) 令 g[i][j]=∑k=1if[k][j]。 Ans=∑i=1n∑a=0m−2(m−a−1)×g[i][a]×(1+∑b=0a−1g[n−i][b]×(a−b+1)) 令 h[i][j]=∑k=0j−1g[i][k]×(j−k+1)。 Ans=∑i=1n∑a=0m−2(m−a−1)×g[i][a]×(1+h[n−i][a]) 处理 f[i][j] 前缀和优化到 O(nm),处理 g[i][j] O(nm),处理 h[i][j] 前缀和优化到 O(nm),计算答案 Ans O(nm)。 总时间复杂度 O(nm)。 代码 View on Github 赏
Comments | NOTHING