只过了一个点,求求大佬看下思路有没有问题....
查看原帖
只过了一个点,求求大佬看下思路有没有问题....
150750
sakura、楼主2022/4/2 22:44

我是用二维前缀和做的,主要就是先求出二维前缀和中最大的一个,并记录他的下标,然后根据这个下标来求得最大和 代码如下

package qianzhui;
/*
 * https://www.luogu.com.cn/problem/P1719
 * */
import java.util.Scanner;
public class zuidajvxing {
	static int n;
	static int[][] nums = new int[121][121];
	static int[][] sum = new int[121][121];
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		n = sc.nextInt();
		for (int i = 1; i <= n; i++) {
			for (int j = 1; j <= n; j++) {
				nums[i][j] = sc.nextInt();
			}
		}
		int x2 = 0, y2 = 0;
		int max = Integer.MIN_VALUE;
		for (int i = 1; i <= n; i++) {
			for (int j = 1; j <= n; j++) {
				sum[i][j] = nums[i][j] + sum[i-1][j] + sum[i][j-1] - sum[i-1][j-1];
				if (sum[i][j] > max) {
					max = sum[i][j];
					x2 = i;
					y2 = j;
				}
			}
		}//得到二维前缀和数组中最大的,以及他的下标
		int res = Integer.MIN_VALUE;
		for (int i = 1; i <= x2; i++) {
			for (int j = 1; j <= y2; j++) {
				int num = getSum(i, j, x2, y2);
				if (num > res) {
					res = num;
				}
			}
		}//因为要围成矩形,所以下标限制在x2和y2之间
		System.out.println(res);
		
	}
	static int getSum(int x1, int y1, int x2, int y2) {
		int res = sum[x2][y2] - sum[x2][y1-1] - sum[x1-1][y2] + sum[x1-1][y1-1]; 
		return res;
	}//得到x1 y1到x2 y2之间的和
}
2022/4/2 22:44
加载中...