题目描述
小鹏在奥数课上碰到了一个棋盘难题,有一个 m×n 的格子的棋盘,每个格子里面有一个非负数。
从中取出若干个数,所取数所在的2
个格子不能相邻,并且取出的数的和最大。请你帮帮小鹏快速算出棋盘里不相邻的数最大之和的结果。输入输出格式
输入格式
包括多个测试实例,每个测试实例包括2
整数 m, n 和 m×n 个非负数。
输出格式
对于每个测试实例,输出可能取得的最大的和。输入输出样例1
输入
3 3
75 15 21
75 15 28
34 70 5
输出188
说明提示
m≤50,n≤50
思路
循环加递归,先复制一个棋盘副本,循环对每个格子进行递归不会越界额情况下求不挨着的格子中数值的和,把已经递归过的元素值改成-1。
代码
import java.util.*;
public class Main {
static int[][] arr;
static int[][] copy;
static int h = 2, w = 2, maxSum = 0;
public static int calculate(int i, int j) {
if (copy[i][j] == -1)
return 0;
int m = copy[i][j];
copy[i][j] = -1;
if (j + 2 <= w)
m += calculate(i, j + 2);
if (i + 2 <= h)
m += calculate(i + 2, j);
if (i + 1 <= h && j - 1 >= 0)
m += calculate(i + 1, j - 1);
if (i + 1 <= h && j + 1 <= w)
m += calculate(i + 1, j + 1);
return m;
}
public static void fun() {
for (int i = 0; i <= h; i++) {
for (int j = 0; j <= w; j++) {
//每次都操作副本
copy = arr;
maxSum = Math.max(maxSum, calculate(i, j));
}
}
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("输入行数:");
h = scanner.nextInt() - 1;
System.out.print("输入列数:");
w = scanner.nextInt() - 1;
arr = new int[h + 1][w + 1];
System.out.print("输入元素");
for (int i = 0; i <= h; i++) {
for (int j = 0; j <= w; j++) {
arr[i][j] = scanner.nextInt();
}
}
fun();
System.out.println("最大结果:" + maxSum);
}
}
运行结果