画作

题目描述

小\(\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. Windows平台下源码分析工具

    最近这段时间在阅读 RTKLIB的源代码,目前是将 pntpos.c文件的部分看完了,准备写一份文档记录下这些代码的用处.处理过程.理论公式来源.注意事项,自己还没有弄明白的地方.目前的想法是把每一个 ...

  2. 交换机基础设置之vtp管理vlan设置

    vtp的设置有三种模式1:server模式,负责创建,删除vlan(服务器模式) 2:client模式,负责接收并转发来自server的信息(客户机模式) 3:transparent模式,只负责转发, ...

  3. 读键值对封装成Map

    描述: 有配置文件address_relation.properties,记录地址关系,有如下数据:ZSSS=ZS%,ZSPD, 封装到Map代码如下: public static void main ...

  4. B1091 N-自守数 (15分)

    B1091 N-自守数 (15分) 如果某个数 \(K\)的平方乘以\(N\) 以后,结果的末尾几位数等于 \(K\),那么就称这个数为"\(N\)-自守数".例如 \(3×92 ...

  5. [BZOJ3714]Kuglarz(最小生成树)

    Description 魔术师的桌子上有n个杯子排成一行,编号为1,2,-,n,其中某些杯子底下藏有一个小球,如果你准确地猜出是哪些杯子,你就可以获得奖品.花费\(C_{i,j}\)元,魔术师就会告诉 ...

  6. 牛客暑假多校第二场J-farm

    一.题意 White Rabbit has a rectangular farmland of n*m. In each of the grid there is a kind of plant. T ...

  7. 使用perl发邮件

    如果你使用的是 window 系统,没有 sendmail 工具.这时你就可以使用 perl 的 MIME:Lite 模块作为邮件客户端来发送邮件. 这里我们直接用 cpan 来安装(需要 root ...

  8. Git-改变历史

    悔棋 在日常的Git操作中,会经常出现这样的状况,输入git commit命令刚刚敲下回车键就后悔了:可能是提交说明中出现了错别字,或者有文件忘记提交,或者有的修改不应该提交,诸如此类. Git提供了 ...

  9. 14 Django的用户认证组件

    用户认证 auth模块 from django.contrib import auth django.contrib.auth中提供了许多方法,这里主要介绍其中的三个: 1.1 .authentica ...

  10. java练习——接口与继承

    父类与子类的构造方法: 如果父类中有一个默认无参的构造方法,那么子类的构造方法中会自动进行调用.如果父类有自己的构造方法,且这时父类没有默认无参的构造方法,那么在子类的构造方法中,必须要调用父类的某个 ...