乙個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...