public class MaxCoinCollection {
public static int collectMaxCoins(int[][] coin) {
int rows = coin.length;
int cols = coin[0].length;
// 创建一个二维数组dp,用于保存到达每个位置的最大硬币数
int[][] dp = new int[rows][cols];
// 初始化dp数组的第一行和第一列
dp[0][0] = coin[0][0];
for (int i = 1; i < rows; i++) {
dp[i][0] = dp[i - 1][0] + coin[i][0];
}
for (int j = 1; j < cols; j++) {
dp[0][j] = dp[0][j - 1] + coin[0][j];
}
// 填充dp数组的其余部分
for (int i = 1; i < rows; i++) {
for (int j = 1; j < cols; j++) {
dp[i][j] = coin[i][j] + Math.max(dp[i - 1][j], dp[i][j - 1]);
}
}
// 打印收集路径
printPath(dp, coin);
// 返回右下角的值,即最大硬币数
return dp[rows - 1][cols - 1];
}
public static void printPath(int[][] dp, int[][] coin) {
int i = 0;
int j = 0;
System.out.println("收集路径:");
while (i < dp.length - 1 || j < dp[0].length - 1) {
System.out.println("(" + (i + 1) + ", " + (j + 1) + ")");
if (i < dp.length - 1 && j < dp[0].length - 1) {
if (dp[i + 1][j] > dp[i][j + 1]) {
i++;
} else {
j++;
}
} else if (i < dp.length - 1) {
i++;
} else {
j++;
}
}
System.out.println("(" + (dp.length) + ", " + (dp[0].length) + ")");
}
public static void main(String[] args) {
int[][] coin = {
{0, 0, 0, 0, 1, 0},
{0, 1, 0, 1, 0, 0},
{0, 0, 0, 1, 0, 1},
{0, 0, 1, 0, 0, 1},
{1, 0, 0, 0, 1, 0}
};
int maxCoins = collectMaxCoins(coin);
System.out.println("收集最大硬币数:" + maxCoins);
}
}