蓝桥试题 算法提高 矩阵翻转
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;
}
参考资料
蓝桥试题 算法提高 矩阵翻转相关推荐
- Java实现 蓝桥杯 算法提高 矩阵翻转
问题描述 Ciel有一个N*N的矩阵,每个格子里都有一个整数. N是一个奇数,设X = (N+1)/2.Ciel每次都可以做这样的一次操作:他从矩阵选出一个X*X的子矩阵,并将这个子矩阵中的所有整数都 ...
- 蓝桥杯 算法提高 矩阵乘方
算法提高 矩阵乘方 时间限制:1.0s 内存限制:512.0MB 问题描述 给定一个矩阵A,一个非负整数b和一个正整数m,求A的b次方除m的余数. 其中一个nxn的矩阵除m的余数得到 ...
- 蓝桥试题 算法提高 打包(二分法,最大值最小化)
资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 Lazy有N个礼物需要打成M个包裹,邮寄给M个人,这些礼物虽然很便宜,但是很重.Lazy希望每个人得到的礼物的编号都是连续的.为了 ...
- 算法笔记_167:算法提高 矩阵翻转(Java)
目录 1 问题描述 2 解决方案 1 问题描述 问题描述 Ciel有一个N*N的矩阵,每个格子里都有一个整数. N是一个奇数,设X = (N+1)/2.Ciel每次都可以做这样的一次操作:他从矩阵 ...
- 蓝桥试题 算法训练 矩阵加法 JAVA
问题描述 给定两个N×M的矩阵,计算其和.其中: N和M大于等于1且小于等于100,矩阵元素的绝对值不超过1000. 输入格式 输入数据的第一行包含两个整数N.M,表示需要相加的两个矩阵的行数和列数. ...
- 蓝桥试题 算法提高 求最小公倍数 JAVA
问题描述 从键盘输入M.N(M.N取值长整范围)两个数,求它们的最小公倍数. 输入格式 输入文件只有一行,有两数被空格隔开,分别表示M.N的值. 输出格式 只有一个数,即M.N的最小公倍数. 样例输入 ...
- 蓝桥试题 算法提高 使用指针逆序输出 JAVA
问题描述 编写程序,输入一个字符串,使用指针逐个逆序输出字符串中所有字符. 输入格式 输入一个字符串 输出格式 输出一个与输入相应的逆序字符串 样例输入 一个满足题目要求的输入范例. abcd 样例输 ...
- 蓝桥试题 算法提高 3-3求圆面积表面积体积 JAVA
问题描述 接受用户输⼊的数值,输出以该值为半径的(1)圆面积,(2)球体表面积,(3)球体体积.pi 取值3.1415926536 ,结果保留10位小数,每一列占20个字符,左对齐. 样例输入 一个满 ...
- 蓝桥试题 算法提高 珠心算测验 JAVA
思路:输入数字总数,输入数字,求输入数字两两相加的和有几种情况例如1 2 3 4这四个数字里面只能有1+2=3和1+3=4,那如果是2+3=5,因为输入的数字里没有5,所以不计入最终结果. 补充知识点 ...
最新文章
- git保姆级入门(包含解决git仓库报错500的问题)
- Scanpy(三)可视化函数
- ABP官方文档翻译 6.1.3 异常处理
- 「原创」马云又嗨啦,云栖音乐节与李健同台飙歌,把健哥都带跑调了
- WIN32 Inline HOOK
- JAVA——监听器ActionListener与MouseListener执行顺序
- c# vscode 配置_[VSCode插件推荐] Code Runner: 代码一键运行,支持超过40种语言
- Spring Boot自定义错误页面
- ES6-16 WeakMap与WeakSet、proxy与reflect
- Azure开发者任务之一:解决Azure Storage Emulator初始化失败
- 物种分布模型_减少物种分布建模中的空间自相关
- Sql server在另一台服务器,在Visual Studio 中没问题,IIS中 提示“在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误。。。。”...
- cpio -H newc参数详解
- 利用IE的滤镜解决IE6下PNG图片透明BUG
- FPGA:verilog实现直接型巴特沃斯高通IIR滤波器
- 《C语言详解》_by_Hanly.学习笔记(1)
- 特斯拉Tesla Model 3整体架构解析
- NoSQL数据库的基础知识
- ORB2单目读代码笔记5--利用灰度质心计算ORB特征点方向,实现旋转不变性
- 新手自主创业需要注意哪些误区?
热门文章
- android系统的刷机步骤,安卓系统手机怎么刷机详细图文教程
- 企业社保代缴有什么好处
- HTML学生个人网站作业设计:动漫网站设计——海绵宝宝(5页) HTML+CSS+JavaScript 简单DIV布局个人介绍网页模板代码 DW学生个人网站制作成品下载
- df.fillna()
- R语言处理数据——替换数据中某元素
- 微信小程序微信头像使用canvas绘制失败问题开发工具正常真机不显示的解决方案
- java 导致内存泄露的情况_JConsole定位内存泄漏
- 该文件没有与之关联的程序来执行该操作。请安装一个程序,或者,如果已安装程序,请在“默认程序”控制面板中创建关联。
- catf1ag Misc writeup(wp) 可能会持续更新
- 令人崩溃的yaml(yml配置)对比properties、json、TOML