腾讯2016年4月2号暑假实习移动开发岗的笔试题,编程题第一题大概题目是:
一个m*n的矩阵,只能向右走或是向下走,矩阵每一个元素代表一个财富值,要求打印出从左上角到右下角走的财富最大总值。
如输入m=4 ,n=5,
输入矩阵value=
{ 0 0 7 0 0,
0 0 0 5 0,
2 0 4 0 0,
0 0 0 3 0},
打印出最大财富总值是15。
这是动态规划的题目,跟“[leetcode 64] Minimum Path Sum——从左上角到右下角的最小路径值”的思路是一样的,
C++的参考代码如下:
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
int value[1024][1024];
int main()
{
int m, n;
scanf_s("%d%d", &m, &n);
//输入矩阵
for (int i = 0; i < m; ++i)
{
for (int j = 0; j < n; ++j)
{
scanf_s("%d", &value[i][j]);
}
}
//计算
for (int i = 1; i < m; ++i)
{
value[i][0] += value[i - 1][0];
}
for (int j = 1; j < n; ++j)
{
value[0][j] += value[0][j - 1];
}
for (int i = 1; i < m; ++i)
{
for (int j = 1; j < n; ++j)
{
value[i][j] += max(value[i - 1][j], value[i][j - 1]);
}
}
////打印调试
//for (int i = 0; i < m; ++i)
//{
// for (int j = 0; j < n; ++j)
// {
// cout << value[i][j] << " ";
// }
// cout << endl;
//}
//cout << endl;
cout << value[m - 1][n - 1] << endl;
return 0;
}
程序运行结果: