画作

题目描述

小\(\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. 正则(re 模块)

    就其本质而言,正则表达式(或 RE)是一种小型的.高度专业化的编程语言,(在Python中)它内嵌在Python中,并通过 re 模块实现.正则表达式模式被编译成一系列的字节码,然后由用 C 编写的匹 ...

  2. python--Wrapper

    然后给大家介绍的是Wrapper(装饰器),使用广泛.python笔试,面试的话也会百分百问到的,基础和中级的知识储备还是必用的. 让我们开始. 先来一些基础相关知识 *args,**kwargs的区 ...

  3. PHP关闭notice级别的错误提示

    1.在php.ini文件中改动error_reporting改为: error_reporting=E_ALL & ~E_NOTICE 2.如果你不能操作php.ini文件,你可以使用如下方法 ...

  4. Linux编译移植Qt4的环境_在OMAPL138平台

    Linux编译Qt4的环境_OMAPL138 手里有一块创龙OMAPL138的板子,我要在上面成功移植Qt环境和触摸屏幕,这是我第二次进行Linux的Qt环境移植,发现了很多问题,需要重新整理. 我编 ...

  5. C语言真正的编译过程(4个步骤~~预编译,编译,汇编,连接)

    转载自:https://www.cnblogs.com/wuyouxiaocai/p/5701088.html#commentform 说实话,很多人做了很久的C/C++,也用了很多IDE,但是对于可 ...

  6. 操作视频-对视频进行canny边缘检测

    #include<opencv2/opencv.hpp> using namespace cv; int main() { VideoCapture capture(); //从摄像头读入 ...

  7. 在intellij idea 里来回跳转查询方法

    在intellij idea 里来回跳转查询方法,在不知道快捷键的时候真是抓狂. 看到key map中的快捷键 后退back  ctrl +alt + ← 或者button4 click 前进forw ...

  8. 区间DP入门题目合集

      区间DP主要思想是先在小区间取得最优解,然后小区间合并时更新大区间的最优解.       基本代码: //mst(dp,0) 初始化DP数组 ;i<=n;i++) { dp[i][i]=初始 ...

  9. [bzoj3071]N皇后

    哈哈哈水题~ 但是不能一眼看出来的..我想了一个小时?! 题面 Description “国际象棋中,一方的皇后数不能超过5个” 一个N*N的棋盘,任意摆放皇后,最坏情况下最少需要多少个皇后才能保证所 ...

  10. SuperHelper——灵活通用的、开源的.Net ORM微型框架

    SuperHelper是博主利用业余时间编写的一个ORM微型框架,除了可以提高开发效率,与其它ORM框架相比,博主更加喜欢SuperHelper的使用简单.适用范围广的特点. 简介 SuperHelp ...