|
|
|
@ -77,7 +77,7 @@ $N≤10$
|
|
|
|
|
|
|
|
|
|
很明显,傻子都知道方案$2$是最优选择。
|
|
|
|
|
|
|
|
|
|
两个小朋友 **一起走** 为什么就行呢?因为他们在一起整体考虑,互相关心、互相照顾~,彼此能知道对方走了哪个点,自己在不影响最优取值的情况下,尽可能的取次优的点,这样,就可以得到全局最优解。
|
|
|
|
|
两个小朋友 **一起走** 为什么就行呢?因为他们在一起整体考虑,互相关心、互相照顾~,彼此能知道对方走了哪个点,自己在不影响最优取值的情况下,尽可能的取 **次优** 的点,就可以得到全局最优解。
|
|
|
|
|
|
|
|
|
|
> **一起走**:两个小朋友步调一致,“一二三” 一起走,也就是任意时刻,两人走的步数是完全一样的。
|
|
|
|
|
|
|
|
|
@ -95,7 +95,7 @@ $$
|
|
|
|
|
\end{matrix}\right.
|
|
|
|
|
$$
|
|
|
|
|
|
|
|
|
|
这四种情况,都有可能是$f[x_1][y_1][x_2][y_2]$的前序,具体走哪个,需要对四个进行求$max$,谁大取谁。
|
|
|
|
|
这四种情况,都有可能是$f[x_1][y_1][x_2][y_2]$的前序,具体走哪个,可以理解为四个都试试,然后求$max$,谁大取谁。
|
|
|
|
|
|
|
|
|
|
```cpp {.line-numbers}
|
|
|
|
|
int t = f[x1 - 1][y1][x2 - 1][y2]; //下下
|
|
|
|
@ -104,14 +104,14 @@ t = max(t, f[x1 - 1][y1][x2][y2 - 1]); //下右
|
|
|
|
|
t = max(t, f[x1][y1 - 1][x2 - 1][y2]); //右下
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
还有一个问题没有解决 : **没有加上当前状态新到的位置上的数字**,这个需要讨论一下:
|
|
|
|
|
还有一个问题没有解决 : **没有加上当前状态新到的位置上的数字**,讨论一下:
|
|
|
|
|
|
|
|
|
|
* 两个小朋友走的格子不是同一个:
|
|
|
|
|
$w=t+w[x_1][y_1]+w[x_2][y_2]$
|
|
|
|
|
* ① 两个小朋友走的格子不是同一个:
|
|
|
|
|
$f[x_1][y_1][x_2][y_2]=t+w[x_1][y_1]+w[x_2][y_2]$
|
|
|
|
|
|
|
|
|
|
* 两个小朋友走的格子是同一个
|
|
|
|
|
* ② 两个小朋友走的格子是同一个
|
|
|
|
|
因为题目要求每个格子只能取一次,就是说如果同一时间走到同一个格子中,应该是取一次值即可:
|
|
|
|
|
$w=t+w[x_1][y_1]$
|
|
|
|
|
$f[x_1][y_1][x_2][y_2]=t+w[x_1][y_1]$
|
|
|
|
|
|
|
|
|
|
利用四层循环,从上到下,从左到右的完成状态表的填充,就可以取得正确答案:
|
|
|
|
|
```cpp {.line-numbers}
|
|
|
|
|