我是用二维前缀和做的,主要就是先求出二维前缀和中最大的一个,并记录他的下标,然后根据这个下标来求得最大和 代码如下
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之间的和
}