矩陣取數問題 V2 (51Nod 1084 )

2021-08-22 17:51:44 字數 1262 閱讀 2468

乙個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,j

<= 10000)

output

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

sample input

3 3

1 3 3

2 1 3

2 2 1

sample output

17
既然要求的是兩條路的最大值,那就讓兩條路一起dp,用f[i,j,k,l]表示兩條同時從(1,1)分別走到(i,j)和(k,l)的路的最大和,最後要求的就是f[n,m,n,m],此方法效率o(n^2*m^2)。

四重迴圈太暴力了,只能過codevs的水資料,51nod的大資料根本過不了【n,m<=200

那我們必須尋求效率更高的方法,只用三重迴圈。

事實上我們可以發現,f[i,j,k,l]不管是多少,總是存在i+j=k+l,這是因為他們走過的步數是相同的,那我們何不用這個步數來代替(i和k)或(j和l)呢?

如圖為乙個5*5的矩陣,上面所標記的數字為從(1,1)走到該點的步數step。

那現在我們只需要3重迴圈了,假設我們用step替換掉(j和l),那麼j和l也能用step,i和k算出

,從而重新得到兩個點的座標。

矩陣取數問題 V2 51Nod 1084

考慮dp的話 最笨的方法就是dp i j x y 代表第一條路走到 i,j 第二條路走到 x,y 時的最大值 dp n m n m 即為所求 轉移方程 dp i j x y max dp i 1 j x 1 y dp i 1 j x y 1 dp i j 1 x 1 y dp i j 1 x y 1...

51nod1078 矩陣取數問題 V2

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

51nod1084 矩陣取數問題 V2

o n4 o n3 媽呀為什麼跑這麼慢woc include include include includeusing namespace std define rep i,s,t for int i s i t i define dwn i,s,t for int i s i t i define...