算法筆記_167:算法提高 矩陣翻轉(Java)


目錄

1 問題描述

2 解決方案

 


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
樣例輸出
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);
    }
}

 

 

 

參考資料:

   1. 算法-藍橋杯習題(4-1)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM