题目描述
YMH同学是个爱玩的孩纸,总会想各种游戏来玩。这天,YMH同学又想到了一个好玩的游戏。在一个M行N列的矩阵中(0<N,M<=50),每一个小格子都有一个0到100的自然数,YMH同学想从左上角(1,1)跳到右下角(M,N)。跳的时候只能想下或者向右跳,每到达一个格子都会把那个格子里的数取走,YMH想要得到最大的总和,如果能帮她得到最大总和的话,她会给你这些总和 % 1 个糖果哦!
输入
第一行为整数M和N。
接下来是一个M*N的矩阵。
输出
一个整数,表示YMH同学所得到的最大总和。
样例输入
3 3
1 1 1
0 3 1
0 2 0
1 1 1
0 3 1
0 2 0
样例输出
7
此题目是动态规划问题,也可以用贪心算法来解决,具体看代码。
此题目是动态规划问题,也可以用贪心算法来解决,具体看代码。
#include <cstdio>
int maps[55][55];
int m, n;
int ans;
void solve(int i, int j, int p);
int main()
{
scanf("%d%d", &m, &n);
ans = 0;
for (int i = 0; i < m; ++i)
{
for (int j = 0; j < n; ++j)
scanf("%d", &maps[i][j]);
}
solve(0, 0, maps[0][0]);
printf("%d\n", ans);
return 0;
}
void solve(int i, int j, int p)
{
if (i == m-1 && j == n-1)
{
p += maps[i][j];
if (p > ans)
ans = p;
return;
}
else if (i == m-1 && j < n-1)
{
solve(i, j+1, p+maps[i][j+1]);
return;
}
else if (i < m-1 && j == n-1)
{
solve(i+1, j, p+maps[i+1][j]);
return;
}
else if (i < m-1 && j < n-1)
{
if (maps[i+1][j] > maps[i][j+1]){
solve(i+1, j, p+maps[i+1][j]);
return;
}
else {
solve(i, j+1, p+maps[i][j+1]);
return;
}
return;
}
return;
}