標籤:解決方案 資料規模 min 參考 java 技術 imp code out
目錄
1 問題描述
2 解決方案
1 問題描述問題描述 給定一個n*m的矩陣A,求A中的一個非空子矩陣,使這個子矩陣中的元素和最大。
其中,A的子矩陣指在A中行和列均連續的一塊。輸入格式 輸入的第一行包含兩個整數n, m,分別表示矩陣A的行數和列數。
接下來n行,每行m個整數,表示矩陣A。輸出格式 輸出一行,包含一個整數,表示A中最大的子矩陣中的元素和。範例輸入3 3
-1 -4 3
3 4 -1
-5 -2 8範例輸出10範例說明 取最後一列,和為10。資料規模和約定 對於50%的資料,1<=n, m<=50;
對於100%的資料,1<=n, m<=500,A中每個元素的絕對值不超過5000。
2 解決方案
代碼參考自文末參考資料,同樣思想的Java版本運行逾時。具體思想講解請見文末參考資料。
具體代碼如下:
import java.util.Scanner;public class Main { public static int n, m; public static long[][] map; public static long result = Long.MIN_VALUE; public static void main(String[] args) { Scanner in = new Scanner(System.in); n = in.nextInt(); m = in.nextInt(); map = new long[n][m]; for(int i = 0;i < n;i++) for(int j = 0;j < m;j++) map[i][j] = in.nextLong(); for(int start = 0;start < n;start++) { //開始行 long[] ring = new long[m]; long[] dp = new long[m]; for(int end = start;end < n;end++) { //結束行 for(int j = 0;j < m;j++) //計算start~end行的每一列元素和 ring[j] += map[end][j]; result = Math.max(result, ring[0]); dp[0] = ring[0]; for(int j = 1;j < m;j++) { if(dp[j - 1] < 0) dp[j] = ring[j]; else dp[j] = dp[j - 1] + ring[j]; result = Math.max(result, dp[j]); } } } System.out.println(result); }}
參考資料:
1.藍橋杯 曆屆試題 最大子陣
演算法筆記_176:曆屆試題 最大子陣(Java)