21-22-1蓝桥训练1 D.试题 算法提高 矩阵翻转

问题描述:

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为奇数。

定义:

x=(n+1)/2
a[N][N]表示矩阵初始值
dp[N]表示第x-1行某列是否翻转,0不翻转,1翻转

结论1

每次翻转的子矩阵大小为: x ∗ x x*x x∗x,对于 ( 0 < = i < n , 0 < = j < x ) (0<=i<n,0<=j<x) (0<=i<n,0<=j<x), ( i , j ) (i,j) (i,j), ( i , x − 1 ) , ( i , j + x ) (i,x-1),(i,j+x) (i,x−1),(i,j+x),这三处坐标要么均不翻转,要么其中有两处翻转。在第 x − 1 x-1 x−1行表示为 dp[j] ^ dp[x-1] ^ dp[j+x]==0。 ( 0 < = j < n , 0 < = i < x ) (0<=j<n,0<=i<x) (0<=j<n,0<=i<x)同理。
只要知道其中两个坐标是否翻转,便可求出剩下坐标的翻转与否。

结论2

对于 ( 0 < = i < x , 0 < = j < x ) (0<=i<x,0<=j<x) (0<=i<x,0<=j<x),同时翻转以坐标 ( i , j ) ( i , j + 1 ) ( i + 1 , j ) ( i + 1 , j + 1 ) (i,j)(i,j+1)(i+1,j)(i+1,j+1) (i,j)(i,j+1)(i+1,j)(i+1,j+1)为左上角的子矩阵时,我们发现在矩阵左上角区域中,发生翻转的只有坐标 ( i , j ) (i,j) (i,j),因此实际上在左上角区域中,各坐标的翻转是相互独立的。

步骤

根据结论1,我们可以枚举 x − 1 x-1 x−1行前 x x x列的翻转情况,根据公式求出后 n − x n-x n−x列的翻转情况。
对于每次枚举,可以依据结论2相互独立的特性,先枚举第 x − 1 x-1 x−1列每一行的翻转情况,再枚举左上角区域每个坐标 ( i , j ) (i,j) (i,j),依据结论1可以求出 ( i , j + x ) 、 ( i + x , j ) 、 ( i + x , j + x ) (i,j+x)、(i+x,j)、(i+x,j+x) (i,j+x)、(i+x,j)、(i+x,j+x)的翻转情况,在每次枚举中取最大值即可。

如图所示 5 ∗ 5 5*5 5∗5矩阵,相同颜色代表可由左上角区域链接求出的翻转情况,计算时别忘了加上第 x − 1 x-1 x−1行和第 x − 1 x-1 x−1列。

代码

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
using namespace std;
const int N=123;
int a[N][N];
int dp[N];
int n;
int ans=-0x3f3f3f3f;
int turn(int k){return k?-1:1;
}
int main(){cin>>n;for(int i=0;i<n;i++){for(int j=0;j<n;j++){cin>>a[i][j];}}int x=(n+1)>>1;for(int i=0;i<(1<<x);i++){int now=0;for(int j=0;j<x;j++){dp[j]=(i>>j)&1;dp[j+x]=dp[j]^(i>>(x-1));now+=turn(dp[j])*a[x-1][j]+turn(dp[j+x])*a[x-1][j+x];}for(int j=0;j<x-1;j++){int to=-0x3f3f3f3f;for(int st=0;st<2;st++){int in=turn(st)*a[j][x-1]+turn(st^dp[x-1])*a[j+x][x-1];for(int k=0;k<x-1;k++){in+=max(a[j][k]+turn(0^st)*a[j][k+x]+turn(0^dp[k])*a[j+x][k]+turn(0^st^dp[k+x])*a[j+x][k+x],-a[j][k]+turn(1^st)*a[j][k+x]+turn(1^dp[k])*a[j+x][k]+turn(1^st^dp[k+x])*a[j+x][k+x]);}to=max(in,to);}now+=to;}ans=max(ans,now);}cout<<ans<<endl;return 0;
}

参考资料

蓝桥试题 算法提高 矩阵翻转相关推荐

  1. Java实现 蓝桥杯 算法提高 矩阵翻转

    问题描述 Ciel有一个N*N的矩阵,每个格子里都有一个整数. N是一个奇数,设X = (N+1)/2.Ciel每次都可以做这样的一次操作:他从矩阵选出一个X*X的子矩阵,并将这个子矩阵中的所有整数都 ...

  2. 蓝桥杯 算法提高 矩阵乘方

    算法提高 矩阵乘方   时间限制:1.0s   内存限制:512.0MB      问题描述 给定一个矩阵A,一个非负整数b和一个正整数m,求A的b次方除m的余数. 其中一个nxn的矩阵除m的余数得到 ...

  3. 蓝桥试题 算法提高 打包(二分法,最大值最小化)

    资源限制 时间限制:1.0s   内存限制:256.0MB 问题描述 Lazy有N个礼物需要打成M个包裹,邮寄给M个人,这些礼物虽然很便宜,但是很重.Lazy希望每个人得到的礼物的编号都是连续的.为了 ...

  4. 算法笔记_167:算法提高 矩阵翻转(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 Ciel有一个N*N的矩阵,每个格子里都有一个整数. N是一个奇数,设X = (N+1)/2.Ciel每次都可以做这样的一次操作:他从矩阵 ...

  5. 蓝桥试题 算法训练 矩阵加法 JAVA

    问题描述 给定两个N×M的矩阵,计算其和.其中: N和M大于等于1且小于等于100,矩阵元素的绝对值不超过1000. 输入格式 输入数据的第一行包含两个整数N.M,表示需要相加的两个矩阵的行数和列数. ...

  6. 蓝桥试题 算法提高 求最小公倍数 JAVA

    问题描述 从键盘输入M.N(M.N取值长整范围)两个数,求它们的最小公倍数. 输入格式 输入文件只有一行,有两数被空格隔开,分别表示M.N的值. 输出格式 只有一个数,即M.N的最小公倍数. 样例输入 ...

  7. 蓝桥试题 算法提高 使用指针逆序输出 JAVA

    问题描述 编写程序,输入一个字符串,使用指针逐个逆序输出字符串中所有字符. 输入格式 输入一个字符串 输出格式 输出一个与输入相应的逆序字符串 样例输入 一个满足题目要求的输入范例. abcd 样例输 ...

  8. 蓝桥试题 算法提高 3-3求圆面积表面积体积 JAVA

    问题描述 接受用户输⼊的数值,输出以该值为半径的(1)圆面积,(2)球体表面积,(3)球体体积.pi 取值3.1415926536 ,结果保留10位小数,每一列占20个字符,左对齐. 样例输入 一个满 ...

  9. 蓝桥试题 算法提高 珠心算测验 JAVA

    思路:输入数字总数,输入数字,求输入数字两两相加的和有几种情况例如1 2 3 4这四个数字里面只能有1+2=3和1+3=4,那如果是2+3=5,因为输入的数字里没有5,所以不计入最终结果. 补充知识点 ...

最新文章

  1. git保姆级入门(包含解决git仓库报错500的问题)
  2. Scanpy(三)可视化函数
  3. ABP官方文档翻译 6.1.3 异常处理
  4. 「原创」马云又嗨啦,云栖音乐节与李健同台飙歌,把健哥都带跑调了
  5. WIN32 Inline HOOK
  6. JAVA——监听器ActionListener与MouseListener执行顺序
  7. c# vscode 配置_[VSCode插件推荐] Code Runner: 代码一键运行,支持超过40种语言
  8. Spring Boot自定义错误页面
  9. ES6-16 WeakMap与WeakSet、proxy与reflect
  10. Azure开发者任务之一:解决Azure Storage Emulator初始化失败
  11. 物种分布模型_减少物种分布建模中的空间自相关
  12. Sql server在另一台服务器,在Visual Studio 中没问题,IIS中 提示“在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误。。。。”...
  13. cpio -H newc参数详解
  14. 利用IE的滤镜解决IE6下PNG图片透明BUG
  15. FPGA:verilog实现直接型巴特沃斯高通IIR滤波器
  16. 《C语言详解》_by_Hanly.学习笔记(1)
  17. 特斯拉Tesla Model 3整体架构解析
  18. NoSQL数据库的基础知识
  19. ORB2单目读代码笔记5--利用灰度质心计算ORB特征点方向,实现旋转不变性
  20. 新手自主创业需要注意哪些误区?

热门文章

  1. android系统的刷机步骤,安卓系统手机怎么刷机详细图文教程
  2. 企业社保代缴有什么好处
  3. HTML学生个人网站作业设计:动漫网站设计——海绵宝宝(5页) HTML+CSS+JavaScript 简单DIV布局个人介绍网页模板代码 DW学生个人网站制作成品下载
  4. df.fillna()
  5. R语言处理数据——替换数据中某元素
  6. 微信小程序微信头像使用canvas绘制失败问题开发工具正常真机不显示的解决方案
  7. java 导致内存泄露的情况_JConsole定位内存泄漏
  8. 该文件没有与之关联的程序来执行该操作。请安装一个程序,或者,如果已安装程序,请在“默认程序”控制面板中创建关联。
  9. catf1ag Misc writeup(wp) 可能会持续更新
  10. 令人崩溃的yaml(yml配置)对比properties、json、TOML