1 条题解
-
1
题目大意
给定一个 的网格,要从 走到 ,每次只能向下或向右走。每个格子 有个元素值 。定义路径的价值为:路径上不同元素的个数,求所有路径的价值之和。
思路
枚举所有路径并记录路径上不同元素个数的方法明显不可行且极难编码。我们可以转换思路:求对于每种元素,有多少条不同路径会经过它,也即每种元素会提供多少贡献。
对于某种元素的贡献,可以想到两种方式解决:
- 直接计算该元素的每个点提供的贡献(容斥原理)
- 转换思路:某种元素的贡献 = 所有贡献和 – 所有不经过该元素的贡献和(DP)
方式一:容斥原理(CF559C)
当某元素只有一个点 时,贡献为:
从 到 的总方案数 × 从 到 的总方案数
而从 到 的总方案数,就是组合数:
因为从 到 一共要走 步,其中 步向下, 步向右,在 步中选出 步向下,其余向右。
当该元素有两个点 和 (假设 在 之前),那么计算 的贡献时需要减去重复的路径。更一般地,设该元素的所有点为 ,按从左上到右下的顺序排列。定义 为:从 到第 个点 且不经过同种元素其他点的方案数。
则有递推式:
$$f(i) = C_{x_i+y_i-2}^{x_i-1} - \sum_{j=1}^{i-1} \Big( f(j) \times C_{x_i+y_i-x_j-y_j}^{x_i-x_j} \Big)$$其中 表示从 到 的方案数(前提是 能到达 ,即 且 )。
那么该元素的贡献为:
$$\sum_{i=1}^{k} \Big( f(i) \times C_{n+m-x_i-y_i}^{n-x_i} \Big)$$这样我们枚举所有不同元素,计算其贡献并求和。若第 种元素的数量为 ,则时间复杂度为 ,总时间复杂度为:
其中 为不同元素种类数。
方式二:动态规划
对于某个元素 ,定义 表示从 到 且不经过元素 的方案数。转移方程为:
$$dp[i][j] = \begin{cases} dp[i-1][j] + dp[i][j-1], & a[i][j] \neq x \\ 0, & a[i][j] = x \end{cases}$$计算完后, 就是所有不经过元素 的路径总数。而所有路径总数为:
因此元素 的贡献为:
枚举所有不同元素,求出它们各自的贡献并求和。若共有 种不同元素,则时间复杂度为 。
根号分治
分析两种方式的极端情况:
- 方式一(容斥)在“不同元素少,但单个元素出现次数多”时,时间复杂度会恶化到 。
- 方式二(DP)在“不同元素多,但单个元素出现次数少”时,时间复杂度也会恶化到 。
因此我们可以取长补短:对于出现次数少的元素用容斥,出现次数多的元素用 DP。设基准值 。
- 若某元素出现次数 ,采用容斥原理,时间复杂度 。
- 若某元素出现次数 ,采用 DP,时间复杂度 。
复杂度证明
- 对于 的元素,有:
- 对于 的元素,这样的元素个数最多为 个,每个 DP 花费 ,总复杂度也为 。
因此总时间复杂度稳定在:
这样便能在可接受的时间内解决本题。
- 1
信息
- ID
- 85
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 9
- 标签
- 递交数
- 54
- 已通过
- 6
- 上传者