Loading

P1004 方格取数 题解

原题:P1004 [NOIP 2000 提高组] 方格取数

方法:记忆化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
posted @ 2025-07-13 18:41  BaguetteShimada  阅读(22)  评论(0)    收藏  举报