問題:
給定乙個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個數,中間用空格隔開...