我思路是使用二维矩阵前缀和模板,但是我这里前缀和数组初始化并没有从1开始,而是从0开始,所以初始化时麻烦了一点,提交时最后一个一直过不了,救救孩子吧,卡了好久了 代码如下
import java.util.*;
public class Main {
static int[][] map;
static int[][] sum;
static int n,m,c;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
n = sc.nextInt(); m = sc.nextInt(); c = sc.nextInt();
map = new int[n][m];
sum = new int[n][m];
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
map[i][j] = sc.nextInt();
}
}
init();
int max = Integer.MIN_VALUE;
int indexI = -1 ,indexJ = - 1;
for (int i = 0; i < n - c + 1; i++) {
for (int j = 0; j < m - c + 1; j++) {//整个二维矩阵不用全部遍历
int num = get_sum(i, j, i + c - 1, j + c - 1);//i+c-1是得到对应的矩阵范围
// System.out.println(i + " " + j + "到" + (i + c - 1) + " " + (j + c - 1) + "=" + num);
if (num > max) {
max = num;
indexI = i;
indexJ = j;
}
}
}
System.out.println((indexI + 1) + " " + (indexJ + 1));
}
static void init() {//二维数组前缀和初始化
sum[0][0] = map[0][0];
for (int i = 1; i < n; i++) {
sum[i][0] = sum[i - 1][0] + map[i][0];
}//当列为0时的初始化
for (int j = 1; j < m; j++) {
sum[0][j] = sum[0][j - 1] + map[0][j];
}//当行为0时的初始化
for (int i = 1; i < n; i++) {
for (int j = 1; j < m; j++) {
sum[i][j] = map[i][j] + sum[i-1][j] + sum[i][j-1] - sum[i-1][j-1];
}
}//其余部分初始化
}
static int get_sum(int x1, int y1, int x2, int y2) {
if (x1 == 0 && y1 == 0) {
return sum[x2][y2];
}//x1 y1等于0直接返回sum数组对于位置
if (x1 == 0) {
return sum[x2][y2] - sum[x2][y1 - 1];
}//x1等于0,其实就是求行的前缀和
if (y1 == 0) {
return sum[x2][y2] - sum[x1 -1][y2];
}//y1等于0求的是列的前缀和
return sum[x2][y2] - sum[x2][y1 - 1] - sum[x1 - 1][y2] + sum[x1 - 1][y1 - 1];
//正常的前缀和公式
}
}