2021寒假每日一題《最大的和》

最大的和

題目來源:《信息學奧賽一本通》
時間限制:\(1000ms\) 內存限制:\(64mb\)java

題目描述

給定一個包含整數的二維矩陣,子矩形是位於整個陣列內的任何大小爲 \(1 * 1\) 或更大的連續子陣列。
矩形的總和是該矩形中全部元素的總和。
在這個問題中,具備最大和的子矩形被稱爲最大子矩形。shell

例如,下列數組:數組

0 -2 -7  0
 9  2 -6  2
-4  1 -4  1
-1  8  0 -2

其最大子矩形爲:spa

9  2
-4  1
-1  8

它擁有最大和 15code

輸入格式

輸入中將包含一個 \(N * N\) 的整數數組。
第一行只輸入一個整數 \(N\) ,表示方形二維數組的大小。
從第二行開始,輸入由空格和換行符隔開的 \(N^2\) 個整數,它們即爲二維數組中的 \(N^2\) 個元素,輸入順序從二維數組的第一行開始向下逐行輸入,同一行數據從左向右逐個輸入。
數組中的數字會保持在 \([-127,127]\) 的範圍內。內存

輸出格式

輸出一個整數,表明最大子矩形的總和。get

數據範圍

\(1 ≤ N ≤ 100\)input

樣例輸入

4
0 -2 -7 0 9 2 -6 2
-4 1 -4  1 -1

8  0 -2

樣例輸出

15

解題思路

AcWing 126. 最大的和:Tell_meio

解題代碼-Java

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        int n = input.nextInt();
        int[][] array = new int[n + 1][n + 1];
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= n; j++) {
                array[i][j] = input.nextInt();
                array[i][j] += array[i - 1][j];
            }
        }
        input.close();

        int ans = Integer.MIN_VALUE;
        for (int i = 1; i <= n; i++) {
            for (int j = i; j <= n; j++) {
                int last = 0;
                for (int k = 1; k <= n; k++) {
                    last = Math.max(last, 0) + array[j][k] - array[i - 1][k];
                    ans = Math.max(ans, last);
                }
            }
        }

        System.out.println(ans);
    }
}
相關文章
相關標籤/搜索