#include <stdio.h>
#include <stdlib.h>
int max(int a, int b) {
return (a > b) ? a : b;
}
void findMaxCoins(int **board, int n, int m) {
int **dp = (int **)malloc(n * sizeof(int *));
for (int i = 0; i < n; i++) {
dp[i] = (int *)malloc(m * sizeof(int));
}
dp[0][0] = board[0][0];
for (int i = 1; i < n; i++) {
dp[i][0] = dp[i-1][0] + board[i][0];
}
for (int j = 1; j < m; j++) {
dp[0][j] = dp[0][j-1] + board[0][j];
}
for (int i = 1; i < n; i++) {
for (int j = 1; j < m; j++) {
dp[i][j] = max(max(dp[i-1][j], dp[i][j-1]), dp[i-1][j-1]) + board[i][j];
}
}
int maxCoins = dp[n-1][m-1];
printf("最大硬币数:%d\n", maxCoins);
int i = n - 1;
int j = m - 1;
printf("路径:(%d, %d) ", i, j);
while (i > 0 || j > 0) {
if (i == 0) {
j--;
} else if (j == 0) {
i--;
} else {
int maxPrev = max(max(dp[i-1][j], dp[i][j-1]), dp[i-1][j-1]);
if (maxPrev == dp[i-1][j-1]) {
i--;
j--;
} else if (maxPrev == dp[i-1][j]) {
i--;
} else {
j--;
}
}
printf("-> (%d, %d) ", i, j);
}
for (int i = 0; i < n; i++) {
free(dp[i]);
}
free(dp);
}
int main() {
int n = 4;
int m = 5;
int board[4][5] = {
{1, 3, 1, 2, 1},
{2, 1, 2, 2, 2},
{1, 2, 3, 1, 2},
{1, 1, 1, 2, 1}
};
int **dynamicBoard = (int **)malloc(n * sizeof(int *));
for (int i = 0; i < n; i++) {
dynamicBoard[i] = (int *)malloc(m * sizeof(int));
for (int j = 0; j < m; j++) {
dynamicBoard[i][j] = board[i][j];
}
}
findMaxCoins(dynamicBoard, n, m);
for (int i = 0; i < n; i++) {
free(dynamicBoard[i]);
}
free(dynamicBoard);
return 0;
}