题目中 n * m 的木板
在题中 通过 1 表示有硬币 0 表示没有硬币
通过 C[][] n = 3 m = 4 来分析思路
0 1 1 0
1 0 1 0
0 1 1 1
从 (0,0) 走到 (2,3)
如果需要知道 (0,0) 是往右边还是往下边走 则需要知道 右边 和 下边 的 大小
下一步 计算 每一步的 的大小 用一个于 数据大小相同数组 F[][]
第一排计算 全部往右走
0 1 2 2 从(0,0) 一直向右 F[0][i] = F[0][i-1] + C[0][i] i > 1
1 1 3 2 从(1,0) 一直向右 初始化 F[1][0] = F[0][0] + C[1][0] F[1][i] = max(F[0][i],F[1][i-1])+ C[1][i]
1 2 4 5 同理 依次往下递推
如果需要知道走过的点 则需要回溯 通过F[][] 减去当前点的值 选择路线
Scanner in = new Scanner(System.in);
int n,m;
n = in.nextInt();
m = in.nextInt();
int[][] target = new int[n][m];
int[][] F = new int[n][m];
for(int i = 0; i < n; i ++) {
for(int j = 0; j < m; j ++) {
C[i][j]= in.nextInt();
}
}
F[0][0] = target[0][0];
for (int j = 1; j < m; j++) {
F[0][j] = F[0][j - 1] + target[0][j];
}
for (int i = 1; i < n; i++) {
F[i][0] = F[i - 1][0] + target[i][0];
for (int j = 1; j < m; j++) {
F[i][j] = Math.max(F[i - 1][j], F[i][j - 1]) + target[i][j];
}
}
System.out.println("最大值:"+F[n - 1][m - 1]);
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
System.out.print(F[i][j]);
}
System.out.println();
}
int count = F[n - 1][m - 1];
// 回溯
for (int i = n - 1, j = m - 1; i > 0 && j > 0;) {
count -= target[i][j];
if (F[i - 1][j] == count) {
--i;
} else {
--j;
}
System.out.println("["+i+","+j+"]");
}