版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
}