[题解] [AGC033D] Complexity
作者:互联网
题面
题解
设 \(f[u][d][l][r]\) 为 \((u, l)\) 到 \((d, r)\) 这个矩形最小的复杂度是多少
那么转移就是
\[f[u][d][l][r] = \begin{cases} max(f[u][k][l][r], f[k + 1][d][l][r])+1, k \in [u, d - 1]\\ max(f[u][d][l][k], f[u][d][k + 1][r]) + 1, k \in [l, r - 1]\\ \end{cases} \]
然而这是一个 \(O(n^5)\) 的 DP
发现答案最大不会超过 \(log(n) + log(m)\)
考虑将复杂度这一维放到状态中来, 对状态中的某一维 DP
设 \(f[c][u][d][l]\) 为复杂度为 \(c\) 时, 矩形最上面一行在 \(u\), 最下面一行在 \(d\), 以 \(l\) 为最左边一列能够延伸多少列
发现竖着切是很简单的
\[f[c][u][d][l] = f[c - 1][u][d][l] + f[c - 1][u][d][l + f[c - 1][u][d][l]] \]
横着切的较为复杂
\[f[c][u][d][l] = max(min(f[c - 1][u][k][l], f[c - 1][k + 1][d][l])), k \in [u, d - 1] \]
此时的复杂度是 \(O(n^4log_n)\)的
考虑到随着 \(k - u\) 越来越大, \(min\) 式中左边的数单调不升, 右边的数单调不降
设 \(min\) 式中左边的数为 \(a\), 右边的数为 \(b\)
当 \(a, b\) 越来越接近的时候他们的 \(min\) 就会越大
那么我们只需要二分出最后一个使得 \(a > b\) 的 \(k\), 设其为 \(k_1\)
那么只需要将 \(k_1\) 和 \(k_1 + 1\)两个位置的取较大的那个即可
复杂度变为 \(O(n^3log_n^2)\)
Code
一点点小启示
当需要被 DP 的值很小的时候, 不妨将其提到状态中去, 对状态中的某一个值进行 DP
标签:min,题解,复杂度,Complexity,DP,max,cases,AGC033D 来源: https://www.cnblogs.com/ztlztl/p/12796855.html