[Jzoj] 3503. 粉刷

题目描述

墙可以看作一个 N×MN\times MN×M 的矩阵,有一些格子是有污点的。现在可以竖着刷一次,覆盖连续的最多CCC列,或者横着刷一次,覆盖连续的最多 RRR 行。已知墙上的情况告诉你,求出最少要刷多少次才能刷干净!

题目解析

DFSDFSDFS先枚举每一行涂和不涂的状态,对于没有涂的行中,用竖着涂的方式补满,求出有哪几列用了竖的方式涂了,然后求出次数,求出最小值即可。

代码

#include<bits/stdc++.h>
using namespace std;
int n,m,r,c,ans=1e9;
bool line[105];
char a[105][105];
int fun()
{
	int t=0;
	for(int i=1;i<=m;i++)
	 if(line[i])
	 {
	   t++;
	   i+=c-1;
	 }
	return t;
}
void dfs(int lev,int t,int s)
{
	if(lev>n)
	{
	  int k=s+fun();
	  if(k<ans)
	   ans=min(ans,k);
	  return;
	}
	if(t==0) dfs(lev+1,r-1,s+1);
	else if(t>0) dfs(lev+1,t-1,s);
	bool vis[105];memset(vis,0,sizeof(vis));
	for(int i=1;i<=m;i++)
	 if(a[lev][i]=='X'&&!line[i])
	  line[i]=vis[i]=1;
	dfs(lev+1,0,s);
	for(int i=1;i<=m;i++)
	 if(vis[i])
	  line[i]=0;
	return; 
}
int main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	 for(int j=1;j<=m;j++)
	  cin>>a[i][j];
	cin>>r>>c;
	dfs(1,0,0);
	cout<<ans;
}
上一篇:CF1445A. Array Rearrangment sort


下一篇:宜信的105条数据库军规