[JZOJ5056]黑白广场
来源:互联网 发布:五笔输入法 知乎 编辑:程序博客网 时间:2024/04/27 15:09
题目大意
一个
你要对网格中的任意格子进行任意次(可以不做)操作,每次操作类型是以下两种之一:
求最少多少次操作能够把这个网格的所有格子都变成白色。
题目分析
考虑使用轮廓线状压dp,最naive的
考虑压缩状态,我们将对一个格子的操作分为以下三种:
这样分类有什么好处呢?可以发现,如果我对一个格子执行了第三种操作,那么不管相邻格子怎么操作,我都可以不额外考虑相邻格子而使得该格子满足要求。
那么现在我们考虑设格子状态了,可以发现,状态也可以设成三种:
那么我们就可以用一个长度为
具体的转移细节就不在这里讲了,自己去思考一下吧。如果你状态表示得好一点,结合一些比较好的实现技巧,可以让你的程序虽然在做
时间复杂度
代码实现
#include <algorithm>#include <iostream>#include <cstdio>#include <cctype>using namespace std;int getnxt(){ char ch=getchar(); while (!isdigit(ch)) ch=getchar(); return ch-'0';}const int N=10;const int M=10;const int S=59049;const int INF=N*M*3;int dig[N][M];int f[2][S];int POW[M];int n,m,s;void pre(){ POW[0]=1; for (int i=1;i<M;++i) POW[i]=3ll*POW[i-1];}void update(int &x,int y){x=min(x,y);}int getsta(int sta,int x,int d){ int u=sta/POW[m-1]%3; if (x>=0) (sta-=u*POW[m-1])+=x*POW[m-1]; return (sta/=3)+=d*POW[m-1];}int dp(){ s=POW[m-1]*3; int cur=1,nxt=0; for (int i=1;i<s;++i) f[nxt][i]=INF; f[nxt][0]=0; for (int i=0;i<n;++i) for (int j=0;j<m;++j) { swap(cur,nxt); for (int s_=0;s_<s;++s_) f[nxt][s_]=INF; for (int s_=0,lst,rst;s_<s;++s_) if (f[cur][s_]!=INF) { lst=s_%3,rst=!j?0:s_/POW[m-1]%3; if (!i||lst!=1) update(f[nxt][getsta(s_,j?rst:-1,dig[i][j]^(rst==2)^(lst==2))],f[cur][s_]); if (!i||lst!=1) update(f[nxt][getsta(s_,j?rst:-1,dig[i][j]^(rst==2)^(lst==2)^1)],f[cur][s_]+2); if (!i||lst) update(f[nxt][getsta(s_,j?(rst==2?rst:rst^1):-1,2)],f[cur][s_]+1); } } int ret=n*m*2; for (int s_=0;s_<s;++s_) { bool judge=1; for (int x=s_;x;x/=3) if (x%3==1) { judge=0; break; } if (judge) ret=min(ret,f[nxt][s_]); } return ret;}int main(){ freopen("square.in","r",stdin),freopen("square.out","w",stdout); for (pre();scanf("%d%d",&n,&m),n||m;) { for (int i=0;i<n;++i) for (int j=0;j<m;++j) dig[i][j]=getnxt(); printf("%d\n",dp()); } fclose(stdin),fclose(stdout); return 0;}
0 0
- [JZOJ5056]黑白广场
- 【JZOJ5056】【GDSOI2017模拟4.13】黑白广场
- 激情广场
- 秋水广场
- 广场舞
- 汇泉广场夜景
- 人民广场,上海博物馆
- 文化广场随笔.
- 运河文化广场
- 我们的广场
- 广场协议事件一览表
- 群光广场美食
- 1002 祭祀广场
- 北航1002-祭祀广场
- 1002 祭祀广场
- 居民还击广场舞
- 新泰滨湖广场
- 新东方广场集合
- Lua的面向对象设计1
- QT一键远程调试程序
- 解决Button自动刷新页面的问题
- C语言各类型在x86与x64环境下的长度
- rtmp 常用字段含义
- [JZOJ5056]黑白广场
- android 三种notification 的简单使用
- 2017gmic北京移动互联网大会最新活动优惠,只有这里可以独享5折(又有惊喜!)
- GDOI冲刺训练模拟赛第一套总结
- 书签备份
- 移动端 华为手机 input中placeholder垂直居中失效
- 格式化字符串漏洞利用 三、格式化字符串漏洞
- 单页面模式路由刷新404问题
- 学习淘淘商城第二十课(实现图片上传功能)