51nod1078 矩陣取數問題 V2

2021-08-22 16:36:23 字數 1971 閱讀 2881

乙個m*n矩陣中有不同的正整數,經過這個格仔,就能獲得相應價值的獎勵,先從左上走到右下,再從右下走到左上。第1遍時只能向下和向右走,第2遍時只能向上和向左走。兩次如果經過同乙個格仔,則該格仔的獎勵只計算一次,求能夠獲得的最大價值。

例如:3 * 3的方格。

1 3 3

2 1 3

2 2 1

能夠獲得的最大價值為:17。1 -> 3 -> 3 -> 3 -> 1 -> 2 -> 2 -> 2 -> 1。其中起點和終點的獎勵只計算1次。

input

第1行:2個數m n,中間用空格分隔,為矩陣的大小。(2 <= m, n <= 200) 

第2 - n + 1行:每行m個數,中間用空格隔開,對應格仔中獎勵的價值。(1 <= ai,ji,j <= 10000)

output

輸出能夠獲得的最大價值。

sample input

3 3

1 3 3

2 1 3

2 2 1

這是那個簡單的矩陣取數問題的高階版,讓我們來分析一下思路。之前那個是從左上走到右下,問走過路徑的最大和,我們考慮選一條整體最優路徑即可。那麼這個題也能按這種方法嗎?看下圖。

如果第一條路徑先找最優的,就要走路徑

(1; 1) ! (1; 2) ! (1; 3) ! (2; 3) ! (3; 3) ! (3; 4) ! (3; 5) ! (4; 5) ! (5; 5),

但是這樣(1,5)和(5,3)的兩個100就分開了,第二條路徑至多取到

乙個100。

事實上,我們可以選取這樣的兩條路徑,取得了全部的100:

沒招了麼?其實我們可以「兩個人一起」dp(讓兩個人同時走)。

用dp[x1][y1][x2][y2]表示第乙個人在(x1,y1) 並且第二個人在(x2,y2)時的最大值。

我們有初值dp[1][1][1][1] = a[1][1],求的是dp[m][n][m][n]。

問題來了:每個人走一步,狀態轉移是什麼?

dp[x1][y1][x2][y2] = max(dp[x1'][y1'][x2'][y2']) + a[x1][y1] + a[x2][y2]

其中(x1',y1')是(x1,y1)的鄰居,(x2',y2')是(x2,y2)的鄰居。

事實上,因為我們有這個等式提示我們其實只要用3維就可以表

示這個矩陣,因為y2 = x1 + y1 - x2所以那一維可以用走多少

步表示出來。

dp[step][x1][x2] = max(dp[step-1][x1'][x2']) + a[x1][y1] + a[x2][y2]

然而這個dp並沒有體現出走到相同格仔,數字僅計算一次的要

求。那麼我們加上這個條件:如果x1 = x2,dp[step][x1][x2]

= max(dp[step-1][x1'][x2']) + a[x1][y1]。

ac**如下:

#includeusing namespace std;

const int maxn = 205;

int dp[405][maxn][maxn];

int a[maxn][maxn];

int m,n;

void solve()

} }}int main()

51Nod 1083 矩陣取數問題

乙個n n矩陣中有不同的正整數,經過這個格仔,就能獲得相應價值的獎勵,從左上走到右下,只能向下向右走,求能夠獲得的最大價值。例如 3 3的方格。1 3 3 2 1 3 2 2 1 能夠獲得的最大價值為 11。input 第1行 n,n為矩陣的大小。2 n 500 第2 n 1行 每行n個數,中間用空...

51nod 1083 矩陣取數問題

1083 矩陣取數問題 基準時間限制 1 秒 空間限制 131072 kb 分值 5難度 1級演算法題 乙個n n矩陣中有不同的正整數,經過這個格仔,就能獲得相應價值的獎勵,從左上走到右下,只能向下向右走,求能夠獲得的最大價值。例如 3 3的方格。1 3 3 2 1 3 2 2 1 能夠獲得的最大價...

51nod 1083 矩陣取數問題

基準時間限制 1 秒 空間限制 131072 kb 分值 5 難度 1級演算法題 乙個n n矩陣中有不同的正整數,經過這個格仔,就能獲得相應價值的獎勵,從左上走到右下,只能向下向右走,求能夠獲得的最大價值。例如 3 3的方格。1 3 3 2 1 3 2 2 1 能夠獲得的最大價值為 11。input...