目錄
1 問題描述
問題描述
Ciel有一個N*N的矩陣,每個格子里都有一個整數。
N是一個奇數,設X = (N+1)/2。Ciel每次都可以做這樣的一次操作:他從矩陣選出一個X*X的子矩陣,並將這個子矩陣中的所有整數都乘以-1。
現在問你經過一些操作之后,矩陣中所有數的和最大可以為多少。
輸入格式
第一行為一個正整數N。
接下來N行每行有N個整數,表示初始矩陣中的數字。每個數的絕對值不超過1000。
輸出格式
輸出一個整數,表示操作后矩陣中所有數之和的最大值。
樣例輸入
3
-1 -1 1
-1 1 -1
1 -1 -1
-1 -1 1
-1 1 -1
1 -1 -1
樣例輸出
9
數據規模與約定
1 <= N <= 33,且N為奇數。
2 解決方案
本題代碼參考文末參考資料1,具體編寫思想我也沒有理解,只能硬生生的仿照參考資料中代碼敲了一遍,然后通過了藍橋系統的數據檢測>~<
具體代碼如下:
import java.util.Scanner; public class Main { public static int N, X; public static int[][] Ciel; public static int ans = Integer.MIN_VALUE; //最終結果,初始化為最小 public void getTempMax() { int max = 0; int tempA ,tempB; for(int j = 0;j < N;j++) max += Ciel[X - 1][j]; for(int i = 0;i < X - 1;i++) { tempA = Integer.MIN_VALUE; tempB = Ciel[i][X - 1] + Ciel[i + X][X - 1]; for(int j = 0;j < X - 1;j++) tempB += Math.abs(Ciel[i][j]+Ciel[i][j+X]+Ciel[i+X][j]+Ciel[i+X][j+X]); tempA = Math.max(tempA, tempB); tempB = -1 * (Ciel[i][X - 1] + Ciel[i + X][X - 1]); for(int j = 0;j < X - 1;j++) tempB += Math.abs((-1)*Ciel[i][j]+Ciel[i][j+X]+(-1)*Ciel[i+X][j]+Ciel[i+X][j+X]); tempA = Math.max(tempA, tempB); max += tempA; } ans = Math.max(max, ans); } public void getResult() { for(int t = 0;t < (1<<X-1);t++) { for(int j = 0;j < X - 1;j++) { if((t&(1<<j)) != 0) { for(int i = 0;i < X;i++) { Ciel[i][j] *= -1; Ciel[i][j + X] *= -1; } } } getTempMax(); for(int j = 0;j < X - 1;j++) { if((t&(1<<j)) != 0) { for(int i = 0;i < X;i++) { Ciel[i][j] *= -1; Ciel[i][j + X] *= -1; } } } } } public static void main(String[] args) { Main test = new Main(); Scanner in = new Scanner(System.in); N = in.nextInt(); X = (N + 1) / 2; Ciel = new int[N][N]; for(int i = 0;i < N;i++) for(int j = 0;j < N;j++) Ciel[i][j] = in.nextInt(); test.getResult(); System.out.println(ans); } }
參考資料: