您的位置:首页 > 编程语言 > Java开发

算法-蓝桥杯-算法提高 矩阵翻转 (JAVA)

2018-03-27 15:58 411 查看

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

;
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 结束语

    分享和帮助是人生一大乐事,希望可以帮助您。本人才疏学浅,如果有不当之处,还请批评指正。同时欢迎大家评论、点赞及转发!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息