CSP J2020 T4 方格取數

2022-07-12 00:51:09 字數 1006 閱讀 3118

考慮對每一列進行 dp。

記 $f(i,j)$ 代表從 $(1,1)$ 走到第 $i$ 列第 $j$ 行的最大值,$sum(i,j,k)$ 代表在第 $i$ 列中第 $j$ 行到第 $k$ 行的數字之和。

那麼很明顯地,當 $i>1$ 時 $f(i,j)$ 一定收到 $f(i-1,k)$ 中的其中乙個 $k$ 推導出。

而從 $f(i-1,k)$ 走到 $f(i,j)$,就需要這樣走:$(i-1,k)\rightarrow (i,k) \rightarrow (i,j)$。

如果不這麼走,變為 $(i-1,k)\rightarrow (i-1,j) \rightarrow (i,j)$ 路徑的話,那你也沒必要從 $(i-1,k)$ 出發求得答案,直接往右移動一格即可。

所以,轉移方程為:

$$f(i,j)=\max\+a_$$

處理一下各列字首和,時間複雜度 $o(n^2m)$,可以拿到 70 分。

現在考慮如何優化:

可以觀察到,$(i-1,k)\rightarrow (i,k)$ 後,想到達任意乙個 $(i,j)$ 只能往上或往下走。

這說明一些 $f(i,j)$ 可能與 $f(i,j-1)$ 或 $f(i,j+1)$ 的答案路徑有重合部分,即 $f(i,j-1)$ 或 $f(i,j+1)$ 可能推出 $f(i,j)$。

但 dp 不能有後效性,不能在同一列又上又下,所以我們開兩個陣列 $g,h$,並設計策略:

$$g(i,j)=\max(f(i-1,j),g(i,j-1))+a_$$

$$h(i,j)=\max(f(i-1,j),h(i,j+1))+a_$$

$$f(i,j)=\max(g(i,j),h(i,j))$$

特殊地,對於 $i>1$,$g(i,1)=f(i-1,1)+a_$,$h(i,n)=f(i-1,n)+a_$。

正確性顯然,對於任意 $(i,j)$, $g$ 和 $h$ 至少包含一條答案最大路徑。

時間複雜度 $o(nm)$,$g,h$ 陣列可以降至一維重複使用。

注意開 long long。

CSP J 2020 T4 方格取數 題解

為什麼大家都是dp啊,我只會寫記憶化搜尋。題目簡潔明瞭,考場上看完這道題後我想到了這道題 n m n m n m 的網格中,小熊從左上角走到右下角,只能向右或向下走,每個格仔有權值 ai,ja ai,j 求出一條路徑使路上權值和最大。大家應該都做過 轉移方程 我竟然用了dp fi,j max f i...

NOIP2000 T4方格取數

先從動規刷起 做了這麼一道題,2000年的老題,提高組第四題 題目描述 description 設有n n的方格圖 n 10,我們將其中的某些方格中填入正整數,而其他的方格中則放入數字0。如下圖所示 見樣例 某人從圖的左上角的a 點出發,可以向下行走,也可以向右走,直到到達右下角的b點。在走過的路上...

1277 方格取數

設有n n的方格圖,我們在其中的某些方格中填入正整數,而其它的方格中則放入數字0。如下圖所示 某人從圖中的左上角a出發,可以向下行走,也可以向右行走,直到到達右下角的b點。在走過的路上,他可以取走方格中的數 取走後的方格中將變為數字0 此人從a點到b點共走了兩次,試找出兩條這樣的路徑,使得取得的數字...