Top 1 path
阿新 • • 發佈:2018-11-23
有一個M行N列的矩陣,其中部分格子裡面有一些有價值的物品。
現在你從左上角出發,每次只能想右或者向下走。
走到右下角的時候,你能獲取的物品的總價值最大有多少?
輸入資料:
第一行有兩個數字M N,表示這個矩陣有M行N列。
然後從第二行開始,有M行整數,每行都有N個非負整數,表示這一格的物品價值。
輸出資料:
可以獲取的最大的物品總價值
資料範圍:0<M,N<=1000, 矩陣中的字數不會超過1000
示例:
輸入
4 5
0 0 8 0 0
0 0 0 9 0
0 7 0 0 0
0 0 6 0 0
輸出:
17
---------------------
#include <iostream> #include<algorithm> using namespace std; /** * 用動態規劃方法計算: * 用一個數組result[i][j]儲存每一個點i,j的最大收益 * num[i][j], i=j=0 * result[i][j]=result[i][j-1]+num[i][j], i=0,j!=0 * result[i-1][j]+num[i][j], j=0,i!=0 * Max(result[i-1][j],result[i][j-1])+num[i][j], i!=0,j!=0 * */ int result[1024][1024]; int main() { int m, n; cin >> m >> n; for (int i = 0; i < m; i++) for (int j = 0; j < n; j++) { cin >> result[i][j]; } for (int i = 1; i < m; ++i) { result[i][0] += result[i - 1][0]; } for (int j = 1; j < n; ++j) { result[0][j] += result[0][j - 1]; } for (int i = 1; i < m; ++i) { for (int j = 1; j < n; ++j) { result[i][j] += max(result[i - 1][j], result[i][j - 1]); } } cout << result[m - 1][n - 1] << endl; return 0; }