乙個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 3sample output1 3 3
2 1 3
2 2 1
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...