P1004 方格取数 题解
方法:记忆化DFS(其实是三维DP)
因为 \(N\) 的范围比较小,考虑使用搜索。如果先搜索第一条路径,再搜索第二条路径,总状态数为:
\[\binom{2N-2}{\,N-1}^{2}
=\Theta\!\Bigl(\frac{16^{\,N}}{N}\Bigr)
\approx1.66\times10^{8}
\]
因为再随便加点常数就爆炸了,所以考虑优化方案。
题意中包含“两条路都需要从左上角走到右下角,并且每一步只能向右或向下前进”的条件。如果我们同时搜索两条路,总状态数为:
\[ (2n-1)n^{2} = \Theta(n^{3})\approx1.7\times10^3
\]
可行。
状态设计
将方格抽象为果园,每个格子存储这一个格子拥有的果子数量。有两名玩家从左上角走到右下角,途中可以获得所有经过格子的果子。
令玩家的当前的位置为 \((x_1,y_1),(x_2,y_2)\)。每名玩家走过的总步数为 \(t=x+y-2\;(0\le t\le 2n-2)\)。
因为两名玩家同时前进,他们在每个时刻走过的总步数 \(t\) 相同,所以可以先确定 \(t\) 的值,再根据 \(t\) 决定每个玩家的位置。因此可得三维状态公式:\(f_{t,x_1,x_2} =\) 当步数为 t,第 1 人在行 x_1,第 2 人在行 x_2 时可获得的最大权值。列坐标计算公式:\(y = t+2-x\)。列坐标由 \(t\) 和 \(x\) 决定,不需要额外存储。
状态转移
记增量方向为:
\[(\Delta x_1,\Delta x_2)\in\{(0,1),(1,0),(0,0),(1,1)\}.
\]
令每个格子的权重为 \(w\)(即有几个果子),若下一时刻两人到达 \((x'_1,y'_1),(x'_2,y'_2)\),可得
\[\text{gain} =
\begin{cases}
w(x'_1,y'_1) + w(x'_2,y'_2), & (x'_1,y'_1)\ne(x'_2,y'_2),\\
w(x'_1,y'_1), & \text{otherwise},
\end{cases}
\]
\[f_{t+1,x'_1,x'_2} = \max\bigl(f_{t+1,x'_1,x'_2},\;
f_{t,x_1,x_2}+\text{gain}\bigr).
\]
实现
- 用了哈希所以状态数组只有一维 qwq

浙公网安备 33010602011771号