赞
踩
你可以使用两重循环来枚举子矩阵的左上角和右下角的坐标,然后在这两个坐标之间枚举行和列,计算子矩阵的最大值和最小值,判断是否满足条件。如果满足条件,就更新答案。这样的时间复杂度是 O(n^4),可能会超时。
你可以使用前缀和的思想优化这个算法。首先预处理出每个位置往上累加的和以及往左累加的和。然后枚举子矩阵的左上角和右下角的坐标,根据前缀和计算子矩阵中的最大值和最小值。这样的时间复杂度是 O(n^3),可以通过本题。
下面是代码示例:
``` import java.util.Scanner;
public class Main { static int N = 1010; static int n, m; static int[][] a = new int[N][N]; static int[][] s1 = new int[N][N]; static int[][] s2 = new int[N][N]; static int limit; static int res = 0;
- public static void main(String[] args) {Scanner sc = new Scanner(System.in);
- n = sc.nextInt();
- m = sc.nextInt();
- for (int i = 1; i <= n; i++) {
- for (int j = 1; j <= m; j++) {
- a[i][j] = sc.nextInt();
- }
- }
- limit = sc.nextInt();
- for (int i = 1; i <= n; i++) {
- for (int j = 1; j <= m; j++) {
- s1[i][j] = s1[i][j - 1] + a[i][j];
- s2[i][j] = s2[i - 1][j] + a[i][j];
- }
- }
- for (int i1 = 1; i1 <= n; i1++) {
-

Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。