題目來源:《信息學奧賽一本通》
時間限制:\(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
它擁有最大和 15
。code
輸入中將包含一個 \(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
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); } }