LG P3749 寿司餐厅
对于题中所说的“若$Kiana$一次取走了第 $1, 2, 3$ 种寿司各一份,除了 $d_{1, 3}$ 以外,$d_{1, 2}$,$d_{2,3} $也会被累加进总美味度中”也就等同于取了$d_{i, j}$, 就一定要取$d_{i + 1, j}$, $d_{i, j - 1}$, 假设由$(i, j)$向$(i + 1, j)$, $(i, j - 1)$连边, 也就相当于是一个点如果被选择了, 那么它的后继也一定要被选, 那这个就是个最大权闭合子图, 而对于代价中的$cx$这一部分, 可以直接加在$d_{i, i}$ 里, 如果m != 1, 那对于每一个不同的代号x单独开一个点, 所有的$d_ {i, i}$向$a_i$连边, 然后跑一遍最大流就可以啦
$B.T.W$:之前在想的时候想出了一个88'的暴力,
对于50%的 $n <= 15$的数据点, 可以发现可能会有贡献的情况是$n$个区间, 左端点依次为$1 ~ n$, 而右端点为一个单调不降序列(如果两个区间的右端点相同, 则表示左端点较大的那个区间废掉不取), 然后跑一遍DP会发现满足这样的n个区间的方案数是$40116600$ 也就是 $O(1e7)$级别的, 那么只要保证枚举方案时可以O(1)的处理该方案的价值就可以过, 事实上是可以的, 对于$cx$这一部分也是同上直接加在 $d_{i, i}$里, 而对于$mx^2$这一块, 对于对$a_i$做一个离散化(至多只有n也就是15个不同的值), 然后状压记录是否曾出现过即可, 而对于 $d_{i, j}$ 的累加, 其实也不麻烦,由于此时$n$是$15$, 虽然转移时不能够扫, 但是可以预处理, 结合上面对于区间序列的定义, 也就相当于对于每一个i, 当前枚举到的右端点是k, 而上一个区间也就是i - 1的右端点是j, 对于 j < i的, 直接预处理一个$sum[i][k]$就好, 而如果 j >= i, 那么要累加进答案里的就是$\sum_{l = i}^{j}\sum_{r = j + 1}^{k} d_{l, r}$, 也可以直接预处理一个$dp[i][j][k]$表示左端点 $l \in [i, j]$, 右端点$r \in [j + 1, k]$的 $d_{l, r}$之和, 还是由于 n 是 15, 所以直接 $O(n^2)$转移都没问题, 总复杂度就是$O(n^5 + n^2 + 40116600)$
而对于剩下的n比较大, 但是m = 0的 7 个数据点, 由于没有了$mx^2$要记录$a_i$的状态, 就可以dp, 设一个$f[i][j]$表示前 i 个区间, 右端点最远到了j, 转移就是 $f[i][j] = \sum_{k = 0} ^{j} f[i - 1][k] + dp[i][k][j]$, 这里的$dp[i][j][k]$沿用前面50%的$dp[i][j][k]$, 但是求$dp[i][j][k]$时$O(n^5)$肯定是不可取的了, 可以在开一个$g[i][j] = \sum_{k = i}^{j} d_{i, k}$, 然后求$dp[i][j][k]$的时候就可以只枚举右端点, 就降到$O(n^4)$的了, 卡一卡常应该是可以过的, 总复杂度$O(n^3 + n^4 + n^3)$
然而这88'的暴力实现实在太过复杂, 就没有写程序实现, 理了一遍思路之后还是觉得可行, 就写了个分析放在这里
浙公网安备 33010602011771号