编辑代码

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);
    }

}