【发布时间】:2019-12-25 08:05:48
【问题描述】:
我正在尝试通过动态编程来解决这个问题:
给定一个由 n 行和 m 列组成的矩阵。每个元素都有一个数字 和兔子停留在左上角的元素。
计算使兔子到达底部元素的最大和 只允许移动两个:
向右两步,向下一步(x+2,y+1);
下两步,右一步(x+1,y+2);输入:
第一行包含两个自然数n和m(1 ≤ n,m≤103) – 矩阵的行数和列数。
接下来的 n 行包含 m 个数字——矩阵的值 元素。
左上角坐标为(1, 1),右下角坐标 角落的 - (n, m)。
输出:
兔子到达右下角的最大总和。 如果无法到达右下角,则输出
-输入 1:
3 3 5 0 0 0 1 2 1 0 1输出 1:
-输入 2:
4 4 5 2 1 0 1 0 0 0 2 1 3 0 0 0 1 7输出 2:
13
这是我尝试开发的代码:
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <algorithm>
using namespace std;
void findMaxSum(int *a[], int r, int c)
{
int **res = new int*[r];
for (int i = 0; i < r; i++) {
res[i] = new int[c];
for (int j = 0; j < c; j++)
res[i][j] = -1;
}
for (int i = 0; i < r-1; i++) {
for (int j = i; j < c-1; j++) {
res[i + 1][j + 2] = max(a[i][j] + a[i + 1][j + 2], res[i + 1][j + 2]);
res[i + 2][j + 1] = max(a[i][j] + a[i + 2][j + 1], res[i + 2][j + 1]);
}
}
for (int i = 0; i < r; i++) {
for (int j = 0; j < c; j++)
cout << res[i][j] << " ";
cout << endl;
}
delete[] res;
}
int main() {
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
int r, c;
cin >> r >> c;
int **a = new int*[r];
for (int i = 0; i < r; i++) {
a[i] = new int[c];
}
for (int i = 0; i < r; i++) {
for (int j = 0; j < c; j++)
cin >> a[i][j];
}
findMaxSum(a, r, c);
delete[] a;
return 0;
}
这是方法吗,for循环里面的计算是否正确?
【问题讨论】:
-
太棒了!请阅读该链接。
-
你的做法是正确的;你的计算不是。我不想讲太多细节,因为这看起来像是一个家庭作业问题,但是如果您通过输入 2 手动应用此算法,您会注意到您所做的并不是代码中的内容。
-
@dspeyer 这不是作业问题,只是为了练习动态规划。
-
@dspeyer 如果您能提供一些提示或其他帮助,将不胜感激