Top 1 path

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_27500493/article/details/83550520

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

猜你喜欢

转载自blog.csdn.net/qq_27500493/article/details/83550520