题目描述
blablabla
样例
blablabla
算法1
(暴力枚举) $O(n^2)$
blablabla
时间复杂度
参考文献
C++ 代码
blablabla
算法2
(暴力枚举) $O(n^2)$
blablabla
时间复杂度
参考文献
C++ 代码
blablabla
import java.util.Scanner;
class Main{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[][] matrix = new int[n][n];
for (int i = 0; i < n; i) {
for (int j = 0; j < n; j) {
matrix[i][j] = sc.nextInt();
}
}
//我们可以直接grid装Prefixsum
//for (int i = 1; i <= n; i) for (int j = 1; j <= n ;j) matrix[i][j] = matrix[i - 1][j] + sc.nextInt();
int[][] grid = new int[n + 1][n + 1]; // 其实可以开grid = new int[n + 1][n] 我们看得是 row = i to row = j之间几row的结果
// 装的话同理 只用到了matrix[i - 1][j] 开[n + 1][n]就可以
for (int i = 1; i <= n; i) {
for (int j = 1; j <= n; j) {
grid[i][j] = grid[i - 1][j] + matrix[i - 1][j - 1];
}
}
int res = Integer.MIN_VALUE; // 这个注意
for (int j = 1; j <= n; j) { // 因为这个是对于row的prefixsum 所以最小从1开始 i的话可以为0 必须小于j
// 你就想前缀和是不是 j可以1 - n i只能0 - i
for (int i = 0; i < j; i) {
int pre = 0; // 这里就是求maxsubarray 了 把row i to row j之间的sum 变为一维的 之后一维subarray 得到最大值
for (int col = 1; col <= n; col++) { // 这里如果写grid = new int[n + 1][n] 那我们从 col= 0开始到n
int cur = grid[j][col] - grid[i][col]; // 先计算这个subarray 在这个col的大小(也就是row = i to row j的sum)
pre = Math.max(cur, pre + cur);
res = Math.max(res, pre);
}
}
}
System.out.print(res);
}
}