画作

题目描述

小\(\mathrm{G}\)的喜欢作画,尤其喜欢仅使用黑白两色作画.

画作可以抽象成一个\(r\times c\)大小的\(01\)矩阵.现在小\(\mathrm{G}\)构思好了他的画作,准备动笔开始作画.初始时画布是全白的,他每一次下笔可以将一个四联通的部分涂成黑色或白色.

你需要告诉他,在给出的构思下,他最少需要下笔多少次才能完成画作.

注:四联通部分表示这个部分的任意两个点都可以通过四联通的方式到达.

输入输出格式

输入格式

第一行两个正整数\(r,c\).

接下来\(r\)行,每行\(c\)个字符, 表示目标画作.

输出格式

输出一行一个正整数,表示最少需要的下笔步数.

说明:

  • \(\mathrm{Subtask 1 (19pts)}:r\times c\le 15\).
  • \(\mathrm{Subtask 2 (7pts)}:r=1\).
  • \(\mathrm{Subtask 3 (25pts)}:r,c\le 30\).
  • \(\mathrm{Subtask 4 (49pts)}: r,c\le 50\).

各方面我都不知道说什么的题目。

首先需要猜出一个结论:

一定存在一种最优策略,使得每次操作的区域是上一次操作区域的子集且操作颜色相反。

题解的证明不是很懂。

大概就是证明这两种简单的情况

然后推到一些复杂一点的情况进行归纳

还是把题解的证明放一放吧。

然后枚举每个点作为最后一次被染色的点的情况。

把四联通的相同颜色边权置0,不同颜色置1

跑最短路,然后取最远的点作为答案,对每个点的答案取最小值即可

注意这里最短路要跑01BFS

复杂度:\(O(n^4)\)


Code:

#include <cstdio>
#include <cstring>
const int N=52;
const int inf=0x3f3f3f3f;
const int dx[5]={0,-1,0,1,0};
const int dy[5]={0,0,1,0,-1};
int n,m,g[N][N];
int to[N*N][5][2],ans=inf;
int min(int x,int y){return x<y?x:y;}
int max(int x,int y){return x>y?x:y;}
int cal(int i,int j)
{
return m*(i-1)+j;
}
int q[N*N*2],l,r,dis[N*N];
int bfs(int s)
{
int mx=0;
l=50*50,r=l-1;
q[++r]=s;
memset(dis,inf,sizeof(dis));
dis[s]=0;
while(l<=r)
{
int now=q[l++];
for(int i=1;i<=4;i++)
{
int w=to[now][i][0],v=to[now][i][1];
if(dis[v]!=inf) continue;
if(w==0)
dis[v]=dis[now],q[--l]=v;
else if(w==1)
dis[v]=dis[now]+1,q[++r]=v;
}
}
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if(g[i][j])
mx=max(mx,dis[cal(i,j)]);
return mx+1;
}
int main()
{
scanf("%d%d",&n,&m);
char c;
for(int i=1;i<=n;i++)
{
scanf("\n");
for(int j=1;j<=m;j++)
{
scanf("%c",&c);
g[i][j]=c-'0';
}
}
memset(to,-1,sizeof(to));
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
for(int k=1;k<=4;k++)
{
int ti=i+dx[k],tj=j+dy[k];
if(ti<=0||ti>n||tj<=0||tj>m) continue;
int u=cal(i,j),v=cal(ti,tj);
to[u][k][0]=g[i][j]!=g[ti][tj];
to[u][k][1]=v;
}
}
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
ans=min(ans,bfs(cal(i,j)));
printf("%d\n",ans);
return 0;
}

2018.10.9

雅礼集训 Day1 T3 画作 解题报告的更多相关文章

  1. 雅礼集训 Day3 T3 w 解题报告

    w 题目背景 \(\frac 14\)遇到了一道水题,双完全不会做,于是去请教小\(\text{D}\).小\(\text{D}\)看了\(0.607^2\)眼就切掉了这题,嘲讽了\(\frac 14 ...

  2. 雅礼集训 Day5 T3 题 解题报告

    题 题目背景 由于出题人赶时间所以没办法编故事来作为背景. 题目描述 一开始有\(n\)个苹果,\(m\)个人依次来吃苹果,第\(i\)个人会尝试吃\(u_i\)或\(v_i\)号苹果,具体来说分三种 ...

  3. 雅礼集训 Day2 T3 联盟 解题报告

    联盟 题目描述 \(\text{G}\) 国周边的 \(n\) 个小国家构成一个联盟以抵御 \(\text{G}\) 国入侵, 为互相支援,他们建立了\(n−1\) 条双向通路, 使得任意两个国家可以 ...

  4. 「雅礼集训 2017 Day2」解题报告

    「雅礼集训 2017 Day2」水箱 我怎么知道这种题目都能构造树形结构. 根据高度构造一棵树,在树上倍增找到最大的小于约束条件高度的隔板,开一个 \(vector\) 记录一下,然后对于每个 \(v ...

  5. 雅礼集训 Day7 T1 Equation 解题报告

    Reverse 题目背景 小\(\text{G}\)有一个长度为\(n\)的\(01\)串\(T\),其中只有\(T_S=1\),其余位置都是\(0\).现在小\(\text{G}\)可以进行若干次以 ...

  6. 雅礼集训 Day6 T2 Equation 解题报告

    Equation 题目描述 有一棵\(n\)个点的以\(1\)为根的树,以及\(n\)个整数变量\(x_i\).树上\(i\)的父亲是\(f_i\),每条边\((i,f_i)\)有一个权值\(w_i\ ...

  7. 雅礼集训 Day6 T1 Merchant 解题报告

    Merchant 题目描述 有\(n\)个物品,第\(i\)个物品有两个属性\(k_i,b_i\),表示它在时刻\(x\)的价值为\(k_i\times x+b_i\). 当前处于时刻\(0\),你可 ...

  8. 雅礼集训 Day3 T2 u 解题报告

    u 题目背景 \(\frac 14\) 遇到了一道水题,完全不会做,于是去请教小\(\text{D}\).小\(\text{D}\)看了一眼就切掉了这题,嘲讽了\(\frac 14\)一番就离开了. ...

  9. 雅礼集训 Day3 T2 v 解题报告

    v 题目背景 \(\frac 14\)遇到了一道水题,又完全不会做,于是去请教小\(\text{D}\).小\(\text{D}\)看了\(0.607\)眼就切掉了这题,嘲讽了\(\frac 14\) ...

随机推荐

  1. 基于Select模型通信程序的编写,编译和执行

    任务目标 编写Win32程序模拟实现基于Select模型的两台计算机之间的通信,要求编程实现服务器端与客户端之间双向数据传递.客户端向服务器端发送"计算从1到100的奇数和",服务 ...

  2. dts--framework(一)

    dts 大体框架 framework 定义类 定义方法 tests framework调用所需要的函数 ./dpdk/usertools/cpu_layout.py /sys/devices/syst ...

  3. js面向(基于)对象编程—类(原型对象)与对象

    JS分三个部分: 1. ECMAScript标准--基础语法 2. DOM  Document Object Model 文档对象模型 3. BOM  Browser Object Moldel 浏览 ...

  4. php扩展开发-INI配置

    php.ini文件是用来保存各项扩展配置的文件,每个扩展都或多或少需要有一个定制化的配置,ini文件是一个很好的保存配置的方式,我们来看下怎么在自己的扩展里,使用到ini的配置功能 //创建ini的配 ...

  5. 华为模拟器ensp安装教程

    华为模拟器说实话有时候真的是很烦人,总是莫名其妙的出问题,而且网上教程一般也解决不了 因此我认为学会ensp的重装真的很重要,因此只要我们删除干净了,安装最多花不了20分钟的时间 接下来我就来说说怎么 ...

  6. Nginx技术深入剖析

    Nginx软件功能模块说明 核心功能模块(Core functionality):主要对应配置文件的Main区块和Events区块. 标准的http功能模块: 企业 场景常用的Nginx http功能 ...

  7. [Bzoj4289]PA2012 Tax(Dijkstra+技巧建图)

    Description 给出一个N个点M条边的无向图,经过一个点的代价是进入和离开这个点的两条边的边权的较大值,求从起点1到点N的最小代价.起点的代价是离开起点的边的边权,终点的代价是进入终点的边的边 ...

  8. spark的排序方法

    今天我们来介绍spark中排序的操作,spark的排序很简单,我们可以直接使用sortBy来进行,这个里面我们使用case clas,使用case class的好处是1.不用newjiukeyi 搞出 ...

  9. 1,版本控制git--仓库管理

    ​ 再开始这个话题之前,让我想起了一件很痛苦的事情,在我大学写毕业论文的时候,我当时的文件是这样保存的 毕业论文_初稿.doc 毕业论文_修改1.doc 毕业论文_修改2.doc 毕业论文_修改3.d ...

  10. 通过Aspose.Word和ZXING生成复杂的WORD表格

    1.前言 这是我之前做的一个项目中要求的功能模块,它的需求是生成一个WORD文档,需要每页一个表格并且表格中需要插入文字.条形码和二维码等信息,页数可控制.具体的效果如下图所示: 可以看到有以下几点是 ...