矩陣取數問題

2021-07-26 16:30:44 字數 1572 閱讀 3145

問題:

給定乙個m行n列的矩陣,矩陣每個元素是乙個正整數,你現在在左上角(第一行第一列),你需要走到右

下角(第m行,第n列),每次只能朝右或者下走到相鄰的位置,不能走出矩陣。走過的數的總和作為你的

得分,求最大的得分。

假設我們定義f(int x,int y)表示從起點到第x行第y列的最優路徑上的數之和,並假設這個矩陣事個二維陣列a (下標從1開始)

遞推式:

我們找到了最大的和,如何得到和最大的路徑呢? 還是從遞推式入手,我們發現如果f(x,y) = f(x – 1,y) + a[x][y] 則它是從上面過來的,所以前乙個位置是(x – 1, y)

否則 f(x, y) = f(x, y – 1) + a[x][y]則它是從左面過來的,所以前乙個位置是(x, y- 1)。

這看起來最優路徑被唯一確定了? 不是的,事實上當f(x – 1,y) = f(x, y – 1)時,前乙個位置在上面或者左面都可以——所以路徑還是很多很多的!

輸入

第1行:n,n為矩陣的大小。(2 <= n <= 500)

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

輸出

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

輸入示例

31 3 3

2 1 3

2 2 1

輸出示例

11

#include #include #include #include #include #define llmin llong_min

using namespace std;

long long a[505][505]; //儲存輸入資料

long long res[505][505]; //填表

int n;

void f() //填表函式

} }void trace(int x,int y) //遞迴,找出路徑

if(res[x][y]==res[x-1][y]+a[x][y])

else

return ;

} int main()

} f();

printf("%lld\n",res[n][n]);

cout<

矩陣取數問題

乙個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個數,中間用空...

矩陣取數問題

乙個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個數,中間用空...

矩陣取數問題

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