题解-bzoj3901 棋盘游戏
2019年第一篇文章 (。・∀・)ノ゙
Problem
bzoj无良权限题,拿学长的号交的
题目概要:给定一个\(n\times n\)的矩阵。令\(x=\frac {n+1}2\)。可以进行任意次以下操作:选择一个\(x\times x\)的子矩阵,将其中所有数乘上\(-1\)。求操作后矩阵元素和的最大值。\(n\leq 33\)且为奇数
Solution
这道题挺有意思的,两道题的思想一拼就成另外一道题了,而且毫不让人厌烦
发现数据范围十分有意思\(n\leq 33\),这个复杂度不是搜索就是折半搜索(废话)
其实更有意思的是\(x=\frac {n+1}2\),由于\(n\)为奇数,则\(2x=n+1\),画个图可以发现在这个棋盘里任意选两个\(x\times x\)的子矩形一定会有相交
画个图发现把子矩形移到四个角后会夹出来一个十字(就是第\(x\)行与第\(x\)列),考虑这个十字有特殊的意义
然后经过缜da密dan思cai考xiang发现这个十字是有对称的意义在里头的,也就是说\(a[1][i],a[1][x],a[1][i+x]\)的选择状态是有关联的,关联就是他们的选择状态的异或和为\(0\)(如果把选择设为\(1\),不选设为\(0\))。证明很简单,就是在矩形中画任意一个子矩形都只能将这三点中的两个或零个点包到矩形里头去,所以最终异或起来只能为\(0\)(即只需要知道这三个元素中的两个就能得到第三个)
类似的,发现除了左右关联(以第\(x\)列为轴)外,上下也是有关联的(以第\(x\)行为轴),到此发现了这是一个以中心十字为轴的矩形!(设第\(x\)行为行轴,第\(x\)列为列轴)
接下来就简单多了,由于\(n\leq 33\)的范围使得不能枚举所有点,那可以枚举行轴(而行轴又是以列轴为轴的,所以只需要枚举行轴的前\(x\)个元素即可推出整个行轴),然后枚举列轴的情况(同样只需要枚举前\(x\)个元素),发现如果行轴情况确定的情况下,列轴的\(x\)个元素带来的影响(即每一行的贡献)都是相互独立的(即不需要\(2^x\)去枚举),每个格子带来的影响也是独立的
上面可能讲得有点抽象,下面细化下过程 (还不懂就看代码吧)
- 枚举第\(x\)行前\(x\)个格子选与不选 \(O(2^x)\)
- 得出第\(x\)行整行的情况 \(O(n)\)
- 枚举第\(i\)行第\(x\)个格子选与不选 \(O(n)\)
- 由当前枚举状态枚举第\(i\)行每个格子\((i,j)\) \(O(n)\)
- 推出格子\((i,j),(i+x,j),(i,j+x),(i+x,j+x)\) \(O(1)\)
总复杂度为\(O(2^xx^2)\),把\(x=17\)代进去大概为\(4e7\)
Code
#include <cstdio>const int N=34;
int a[N][N],rw[N],ln[N];
int n,t;inline int calc(int i,int j){int res=a[i][j],e;e=a[i+t][j],res+=(rw[j]?-e:e);e=a[i][j+t],res+=(ln[i]?-e:e);e=a[i+t][j+t],res+=(ln[i]^rw[j+t]?-e:e);return res>0?res:-res;
}int main(){scanf("%d",&n);t=n+1>>1;for(int i=1;i<=n;++i)for(int j=1;j<=n;++j)scanf("%d",&a[i][j]);int ans=0;for(int lim=1<<t,S=0;S<lim;++S){int sum=0;for(int i=1;i<=t;++i)if(S&(1<<i-1))rw[i]=1,sum-=a[t][i];else rw[i]=0,sum+=a[t][i];for(int i=t+1;i<=n;++i){rw[i]=rw[t]^rw[i-t];if(rw[i])sum-=a[t][i];else sum+=a[t][i];}for(int i=1,r0,r1;i<t;++i){r0=a[i][t]+(rw[t]?-a[i+t][t]:a[i+t][t]);ln[i]=0;for(int j=1;j<t;++j)r0+=calc(i,j);r1=-a[i][t]+(rw[t]?a[i+t][t]:-a[i+t][t]);ln[i]=1;for(int j=1;j<t;++j)r1+=calc(i,j);sum+=r0>r1?r0:r1;}ans=ans>sum?ans:sum;}printf("%d\n",ans);return 0;
}
转载于:https://www.cnblogs.com/penth/p/10205878.html
题解-bzoj3901 棋盘游戏相关推荐
- usaco training 4.4.1 Shuttle Puzzle 题解
Shuttle Puzzle题解 Traditional The Shuttle Puzzle of size 3 consists of 3 white marbles, 3 black marbl ...
- LOJ 一本通一句话题解系列:
第一部分 基础算法 第 1 章 贪心算法 1):「一本通 1.1 例 1」活动安排:按照结束时间排序,然后扫一遍就可以了. 2):「一本通 1.1 例 2」种树:首先要尽量的往区间重叠的部分种树,先按 ...
- 老鱼的-kuangbin专题题解
kuangbin专题问题一览 专题一 简单搜索 POJ 1321 棋盘问题 POJ 2251 Dungeon Master POJ 3278 Catch That Cow POJ 3279 Flipt ...
- [JS][dfs]题解 | #迷宫问题#
题解 | #迷宫问题# 题目链接 迷宫问题 题目描述 定义一个二维数组 N*M ,如 5 × 5 数组下所示: int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 1, 1 ...
- [JS][dp]题解 | #打家劫舍(一)#
题解 | #打家劫舍(一)# 题目链接 打家劫舍(一) 题目描述 描述 你是一个经验丰富的小偷,准备偷沿街的一排房间,每个房间都存有一定的现金,为了防止被发现,你不能偷相邻的两家,即,如果偷了第一家, ...
- [JS]题解 | #魔法数字#
题解 | #魔法数字# 题目链接 魔法数字 题目描述 牛妹给牛牛写了一个数字n,然后又给自己写了一个数字m,她希望牛牛能执行最少的操作将他的数字转化成自己的. 操作共有三种,如下: 在当前数字的基础上 ...
- [JS]题解 | #岛屿数量#
题解 | #岛屿数量# 题目链接 岛屿数量 题目描述 时间限制:1秒 空间限制:256M 描述 给一个01矩阵,1代表是陆地,0代表海洋, 如果两个1相邻,那么这两个1属于同一个岛.我们只考虑上下左右 ...
- [JS] 题解:提取不重复的整数
题解:提取不重复的整数 https://www.nowcoder.com/practice/253986e66d114d378ae8de2e6c4577c1 时间限制:1秒 空间限制:32M 描述 输 ...
- 洛谷-题解 P2672 【推销员】
独门思路!链表加优先队列! 这题一望,贪心是跑不掉了,但是我贪心并不好,所以想到了一个复杂一些但思路更保稳的做法 思路: 1 因为是离线操作,所以我们可以倒着求,先求x=n的情况,因为那样直接就知道了 ...
最新文章
- [vs2008]Visual Studio 2008 SP1添加或删除功能提示查找SQLSysClrTypes.msi文件
- 实现Qemu aarch32虚拟开发板ping www.baidu.com
- munmap_chunk(): invalid pointer
- Python代码:数字图像处理(DIP)7.1.2子带编码example7.2
- InfoPath开发
- scala部分应用函数_Scala中的部分函数
- 阿里云服务器被[kthreaddi]挖矿病毒攻击
- 基于virtualbox安装ubuntu18.04
- SQL Server中的KILL SPID命令
- 自定义Dialog宽度占满屏幕
- c语言教材1-8章参考答案,C语言课后习题参考答案(第1-8章)
- mbedtls 交叉编译
- 【费用流】洛谷1251 餐巾计划问题
- iphone手势识别(双击、捏、旋转、拖动、划动、长按)UITapGestureRecognizer
- Web Services Ksoap 下载多张图片
- Java学习笔记 --- 多分支
- seaweedfs上传文件为什么要先申请文件号?(/dir/assign)(两种工作模式:Volume模式与Filer模式)(seaweed上传文件)
- 什么是框架?常用框架有哪些?
- Go之Benchmark
- 未来应用陈鸿:被微信封掉公众号后怎么办?给微信创业者的10点真诚建议
热门文章
- 中国人工智能学会通讯——电子商务中的个性化推荐技术剖析 1. 基于人生阶段建模的商品推荐...
- MLPlatform project的统一结构-----------运行机制(原理)
- 2017华为机试题--Floyd算法
- 从文件夹里面多个文件里面查找指定内容
- php file_get_contents()请求某个链接
- 简单盘点手游开发引擎
- java 多线程取一条记录_java多线程从队列中取出数据执行
- 一天测血压的最佳时间_高血压病患者,一天之内在什么时间点测血压最好?
- 生成唯一订单号_人人皆知却暗藏玄机的“数据库唯一标识符”
- 使用Netty编写一个简单的群聊系统