闲扯
很巧妙的一道题,思路值得借鉴。
题面
Solution
我们先考虑问题的弱化版: $n\leq 10^3,m\leq 10^3$ 。
考虑 $dp$ 。设 $dp_{i,j}$ 表示走到 $(i,j)$ 这个点,所有的 $G(P_{i,j},k)$ 的总和。
考虑转移。
我们如果只考虑每条线段下方的方格数,那么有如下方程: $dp_{i,j}=dp_{i-1,j}\cdot k^j+dp_{i,j-1}$ 。
表示我们从 $(i-1,j)$ 走到 $(i,j)$ ,多出了 $j$ 个格子,得到的贡献为所有走到 $(i-1,j)$ 的贡献乘上一定有的 $k^j$ ;而从 $(i,j-1)$ 走到 $(i,j)$ ,没有新的格子加入,贡献就为 $dp_{i,j-1}$ 。
但是这个方程是 $O(n^2)$ 的,考虑怎么优化。
因为上面我们考虑的是线段下方的方格数,我们再考虑一下计算方格右边的方格数。
这时我们可以得到以下方程: $dp_{i,j}=dp_{i,j-1}\cdot k^{n-i}+dp_{i-1,j}$ 。
但是我们的初始条件和前一种不同,没办法合并。
但是我们注意到这样一个事实:我们计算右边的格子数的总贡献,是等价于计算左边格子的总贡献的。
这是因为对于计算右边格子的每一种方案,我们都能相应的找到计算左边的一种方案。而我们经过 $180$ 度的旋转操作之后,得到的方案, 刚好把左边和右边反过来了。所以每一种方案都有一个相对应的状态。
所以我们可以将方程改写成如下形式 $dp_{i,j}=dp_{i,j-1}\cdot k^i+dp_{i-1,j}$ 。
这时,我们发现两种转移方程的初始条件都是 $dp_{0.i}=dp_{j,0}=1$ 。
所以我们可以进行这样的操作:
所以我们只需要算出 $k^s,s\in(1,2\cdot i)$ ,即可得到最终的答案。
但是需要特别注意的是:当 $k=1$ 时,上式是恒成立的,不能用来求解。但是此时答案等于到 $(n,m)$ 的路径的方案数,直接用组合数 $C_{n+m}^{n}$ 计算即可。
Code
1 |
|