最后一个一直过不了,救救孩子吧!
查看原帖
最后一个一直过不了,救救孩子吧!
150750
sakura、楼主2022/3/30 15:16

我思路是使用二维矩阵前缀和模板,但是我这里前缀和数组初始化并没有从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];
   	//正常的前缀和公式
   }
}
2022/3/30 15:16
加载中...