1. 程式人生 > >演算法-藍橋杯-演算法提高 矩陣翻轉 (JAVA)

演算法-藍橋杯-演算法提高 矩陣翻轉 (JAVA)

1 引言

    這是藍橋杯演算法提高部分的第一篇文章。通過做演算法提高部分的習題,我深刻地認識到自己在演算法方面的不足,在資料結構方面還有待提高。客觀上來講,自己並沒有一直在做演算法方面的訓練,所以許多題目沒有思路或者說有思路不知道如何實現。另一方面,就是自己在演算法方面投入的時間和精力太少,不善於思考問題。報名藍橋杯,給了我一個認識自己的機會,給了我一個學習演算法的機會。

2 題目

問題描述

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為奇數。

3 原始碼

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);
    }
}

4 結束語

    分享和幫助是人生一大樂事,希望可以幫助您。本人才疏學淺,如果有不當之處,還請批評指正。同時歡迎大家評論、點贊及轉發!

相關推薦

演算法-藍橋-演算法提高 矩陣翻轉 JAVA

1 引言    這是藍橋杯演算法提高部分的第一篇文章。通過做演算法提高部分的習題,我深刻地認識到自己在演算法方面的不足,在資料結構方面還有待提高。客觀上來講,自己並沒有一直在做演算法方面的訓練,所以許多題目沒有思路或者說有思路不知道如何實現。另一方面,就是自己在演算法方面投入

演算法-藍橋-入門訓練 Fibonacci數列 JAVA

1 引言    斐波那契數列一直以來都是一個經典的問題,可惜的是以前“只聞其聲不見其人”,沒有好好地研究這個問題,這次恰好在藍橋杯的入門訓練中遇到,實乃萬幸。2 題目問題描述Fibonacci數列的遞推

2015藍橋決賽 01 機器人數目java

標題:機器人數目少年宮新近郵購了小機器人配件,共有3類,其中,A類含有:8個輪子,1個感測器B類含有: 6個輪子,3個感測器C類含有:4個輪子,4個感測器他們一共訂購了100套機器人,收到了輪子600個,感測器280個。根據這些資訊請你計算:B型別機器人訂購了多少個?請直接提

藍橋-組合公式求值java

演算法提高 組合公式求值 時間限制:1.0s 記憶體限制:256.0MB 問題描述   給定n, m,求: 輸入格式

2017第八屆藍橋 01 外星日曆java

標題:外星日曆某星系深處發現了文明遺蹟。他們的計數也是用十進位制。他們的文明也有日曆。日曆只有天數,沒有年、月的概念。有趣的是,他們也使用了類似“星期”的概念,只不過他們的一個星期包含了9天,為了方便,這裡分別記為: A,B,C....H,I從一些資料上看到,他們的23日是星

藍橋 歷屆試題 翻硬幣Java

小明正在玩一個“翻硬幣”的遊戲。 桌上放著排成一排的若干硬幣。我們用 * 表示正面,用 o 表示反面(是小寫字母,不是零)。 比如,可能情形是:**oo***oooo 如果同時翻轉左邊的兩個硬幣,則變為:oooo***oooo 現在小明的問題是:如果已知了初始狀態和要達到的目標狀態,每次只能同時翻

演算法-藍橋-演算法提高 矩陣相乘 C++

1 引言    矩陣乘法,以前做過。2 題目問題描述  小明最近在為線性代數而頭疼,線性代數確實很抽象(也很無聊),可惜他的老師正在講這矩陣乘法這一段內容。  當然,小明上課打瞌睡也沒問題,但線性代數的習題可是很可怕的。  小明希望你來幫他完成這個任務。  現在給你一個ai行

藍橋 ADV-188 演算法提高 排列數java 深度優先搜尋 DFS

 演算法提高 排列數   時間限制:1.0s   記憶體限制:256.0MB 問題描述   0、1、2三個數字的全排列有六種,按照字母序排列如下:   012、021、102、120、201、210   輸入一個數n   求0~9十個數的全排列中的第n個(

藍橋 ADV-127 演算法提高 日期計算java

 演算法提高 日期計算   時間限制:1.0s   記憶體限制:256.0MB 問題描述   已知2011年11月11日是星期五,問YYYY年MM月DD日是星期幾?注意考慮閏年的情況。尤其是逢百年不閏,逢400年閏的情況。 輸入格式   輸入只有一行

演算法-藍橋-演算法訓練 Torry的困惑(基本型) JAVA

1 引言    Torry的困惑,我們程式設計來解決,我們的困惑,還是要我們自己來解決。。。2 題目問題描述  Torry從小喜愛數學。一天,老師告訴他,像2、3、5、7……這樣的數叫做質數。Torry突然想到一個問題,前10、100、1000、10000……個質數的乘積是多

演算法-藍橋-演算法訓練 最大的算式 JAVA

1 引言    今天的第一篇文章,競賽開始進入倒計時了!2 題目問題描述  題目很簡單,給出N個數字,不改變它們的相對位置,在中間加入K個乘號和N-K-1個加號,(括號隨便加)使最終結果儘量大。因為乘號和加號一共就是N-1個了,所以恰好每兩個相鄰數字之間都有一個符號。例如: 

演算法-藍橋-演算法訓練 Lift and Throw C++

1 引言    吃完飯,繼續,今天的目標是10篇,然後去看《演算法》和課外書。2 題目問題描述  給定一條標有整點(1, 2, 3, ...)的射線. 定義兩個點之間的距離為其下標之差的絕對值.  Laharl, Etna, Flonne一開始在這條射線上不同的三個點, 他們

演算法-藍橋-演算法訓練 表示式計算 JAVA

1 引言什麼題。。。2 題目問題描述  輸入一個只包含加減乖除和括號的合法表示式,求表示式的值。其中除表示整除。輸入格式  輸入一行,包含一個表示式。輸出格式  輸出這個表示式的值。樣例輸入1-2+3*(4-5)樣例輸出-4資料規模和約定  表示式長度不超過100,表示式運算

藍橋——連號區間數暴力

題目:http://lx.lanqiao.cn/problem.page?gpid=T30 分析:注意到輸入格式裡介紹“第二行是N個不同的數字Pi(1 <= Pi <= N)”,這裡就可以知道第二行的數由1,2,3······N-1,N組成,雖然此題不用到這個,但以後也要有這個覺悟,閱讀題目要仔

藍橋練習系統試題集--基礎練習含C/C++答案

藍橋杯練習系統試題集(二)–基礎練習(含C/C++答案) 1 基礎練習 閏年判斷 時間限制:1.0s 記憶體限制:256.0MB 提交此題 錦囊1 錦囊2 問題描述 給定一個年份,判斷這一年是不是閏年。 當以下情況之一滿足時

基於哈夫曼壓縮演算法的壓縮與解壓實現Java

如果需要對一個檔案進行壓縮,第一步是提取出檔案中的內容資訊;第二步是對其中的字元等進行統計,獲得壓縮編碼;第三步是把壓縮編碼及解壓檔案需要的資訊存入一個檔案(或者生成新檔案並存入)。這樣對檔案的壓縮就完成了。 下面就是檔案的解壓,第一步還是讀入檔案,即從前面生

藍橋-----------------基礎訓練 數列排序Java程式碼

一、數列排序   問題描述:給定一個長度為n的數列,將這個數列按從小到大的順序排列。1<=n<=200。 二、解題思想: 對於排序,無論是資料結構還是自己手寫都有很多種方法進行解決。但是,

藍橋 ALGO-105 黑色星期五日期

【思路】:和CCF的一個題目差不多,先算天數,根據天數算星期。 【AC程式碼】: #include <iostream> #include <algorithm> #inclu

藍橋--2013--高斯日記模擬

 1.高斯日記  大數學家高斯有個好習慣:無論如何都要記日記。他的日記有個與眾不同的地方,他從不註明年月日,而是用一個整數代替,比如:4210後來人們知道,那個整數就是日期,它表示那一天是高斯出生後的第幾天。這或許也是個好習慣,它時時刻刻提醒著主人:日子又過去一天,

藍橋 歷屆試題 九宮重排bfs

問題描述  如下面第一個圖的九宮格中,放著 1~8 的數字卡片,還有一個格子空著。與空格子相鄰的格子中的卡片可以移動到空格中。經過若干次移動,可以形成第二個圖所示的局面。  我們把第一個圖的局面記為:12345678.  把第二個圖的局面記為:123.46758  顯然是按從