1. 程式人生 > >Top 1 path

Top 1 path

有一個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;
}