若$\min(n,m)=1$,那么设$f[i][j][k]$表示考虑前$i$个格子,改变了$j$次颜色,$i$的颜色为$k$的方案数,直接转移即可。

否则$\min(n,m)\geq 2$,那么有解当且仅当第一二行重复得到整个图案或者第一二列重复得到整个图案。

假设是第一二行重复:

那么可以设$g[i][j][x][y]$表示考虑前$i$列,改变了$j$次颜色,第一行第$j$列颜色为$x$,第二行第$j$列颜色为$y$的方案数。

预处理出每种颜色会增加几次改变,然后转移即可。

若是第一二列重复,只需要转置这个矩阵,即可转化为第一二行重复。

这其中多算的是第一二行重复同时第一二列重复的情况,此时直接枚举左上角$4$个格子的颜色然后检验即可。

时间复杂度$O(n(m+k))$。

#include<cstdio>
const int N=105,P=1000000007;
int n,m,K,S,o,i,j,k,x,y,t,A,B,f[2][N*N][5],g[2][N*N][4][4],w[4][4],ans;char a[N][N],b[N][N];
inline int getid(char x){
if(x=='G')return 0;
if(x=='B')return 1;
if(x=='R')return 2;
return 3;
}
inline void up(int&a,int b){a=a+b<P?a+b:a+b-P;}
void check(int S){
b[1][1]=S&3;
b[1][2]=S>>2&3;
b[2][1]=S>>4&3;
b[2][2]=S>>6;
for(i=1;i<=n;i++)for(j=1;j<=m;j++)if(i>2||j>2)b[i][j]=b[i&1?1:2][j&1?1:2];
for(t=0,i=1;i<=n;i++)for(j=1;j<=m;j++)if(a[i][j]!=b[i][j])t++;
if(t>K)return;
for(i=1;i<=n;i++)for(j=1;j<=m;j++)
for(x=-1;x<=1;x++)if(i+x>=1&&i+x<=n)for(y=-1;y<=1;y++)if((x||y)&&j+y>=1&&j+y<=m)
if(b[i][j]==b[i+x][j+y])return;
ans++;
}
inline void getw(int x,int m){
for(int A=0;A<4;A++)for(int B=0;B<4;B++){
w[A][B]=0;
for(int i=1;i<=m;i++){
int j=i&1?A:B;
if(j!=b[x][i])w[A][B]++;
}
}
}
void solve(int n,int m){
getw(1,m);
for(j=0;j<=K;j++)for(x=0;x<4;x++)for(y=0;y<4;y++)g[0][j][x][y]=0;
for(o=x=0;x<4;x++)for(y=0;y<4;y++)if(w[x][y]<=K&&x!=y)g[0][w[x][y]][x][y]=1;
for(i=2;i<=n;i++){
getw(i,m);
for(j=0;j<=K;j++)for(x=0;x<4;x++)for(y=0;y<4;y++)g[o^1][j][x][y]=0;
for(j=0;j<=K;j++)for(x=0;x<4;x++)for(y=0;y<4;y++)if(g[o][j][x][y])
for(k=0;k<4;k++)if(k!=x&&k!=y){
t=6-x-y-k;
if(j+w[k][t]<=K){
up(g[o^1][j+w[k][t]][k][t],g[o][j][x][y]);
}
}
o^=1;
}
for(j=0;j<=K;j++)for(x=0;x<4;x++)for(y=0;y<4;y++)up(ans,g[o][j][x][y]);
}
int main(){
scanf("%d%d%d",&n,&m,&K);
for(i=1;i<=n;i++){
scanf("%s",a[i]+1);
for(j=1;j<=m;j++)a[i][j]=getid(a[i][j]);
}
if(n==1||m==1){
for(f[0][0][4]=i=1;i<=n;i++)for(j=1;j<=m;j++){
for(k=0;k<=K;k++)for(x=0;x<5;x++)f[o^1][k][x]=0;
for(k=0;k<=K;k++)for(x=0;x<5;x++)if(f[o][k][x])for(y=0;y<4;y++)if(y!=x)up(f[o^1][k+(y!=a[i][j])][y],f[o][k][x]);
o^=1;
}
for(i=0;i<=K;i++)for(j=0;j<4;j++)up(ans,f[o][i][j]);
}else{
for(S=0;S<1<<8;S++)check(S);
ans=(P-ans)%P;
for(i=1;i<=n;i++)for(j=1;j<=m;j++)b[i][j]=a[i][j];
solve(n,m);
for(i=1;i<=n;i++)for(j=1;j<=m;j++)b[j][i]=a[i][j];
solve(m,n);
}
return printf("%d",ans),0;
}

  

BZOJ2808 : 那些年我们画格子的更多相关文章

  1. 还在用canvas画格子吗?文字烟花效果更不错噢

    大家好,我是小丞同学,一名前端爱好者 欢迎访问博主的个人网站:一口奶盖 "在人间贩卖声音 等凑够满天星辰 放烟花给你看" 上次的烟花有些许平淡,这次来放大招了,让你的名字在天空绽放 ...

  2. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  3. 用.net在画出镂空图片

    最近的一个项目需要用到这个东西,冥思苦想了好几天.还是在同事的帮助下,完成此项难题,希望能够帮助以后的博友们 ! 废话不多说,先看看效果图吧. 首先写一下讲一下思路,首先画一张图,当你的背景,然后在图 ...

  4. python的tkinter,能画什么图?

    今天从下午忙到现在,睡觉. 这个能绘点图的. import json import tkinter as tk from tkinter import filedialog from tkinter ...

  5. 使用matplotlib画出log的图像

    以下内容是学习笔记,若有侵权,立即删除! import math import matplotlib.pyplot as plt import numpy as np if __name__ == ' ...

  6. plt画log图

    import matplotlib.pyplot as plt import math import numpy as np x = np.arange(-0.85,0.95,0.05) #获得函数结 ...

  7. matlab 有趣小细节

    图像的默认显示方式,坐标从1开始计数.是从左向右,从上到下为正,分别为x和y轴          如果加入x轴和y轴画成成的格子,起始位置并不是严格的左上角,而是像素的中心点,并不是以像素的边缘画格子 ...

  8. Areas on the Cross-Section Diagram

    Areas on the Cross-Section Diagram  Aizu - ALDS1_3_D Areas on the Cross-Section Diagram 地域の治水対策として.洪 ...

  9. Ax 导出EXCEL给范围内的每个单元格加边框

    1. 首先在Class\SysExcelRange加画边框的方法 思路用EXCEL录宏的功能得到给一批单元格画格子的VBA代码,在AX将对象转为COM对象,基本VBA代码也能装为AX内能用的内容. p ...

随机推荐

  1. Exchange Server Notes

    以下信息来自Option响应: HTTP/1.1 200 OK Cache-Control: private Allow: OPTIONS,POST Server: Microsoft-IIS/7.0 ...

  2. 变相实现textarea文本域

    效果图: html: <div> <form action=""> <div class="ta-div" contentedit ...

  3. UEditor黑白名单配置

    在网上找了很多,都不对.自己尝试,代码如下: 在new UEditor之前加上: Object.assign(window.UEDITOR_CONFIG.whitList, { filling: [' ...

  4. MyBatis配置:在控制台打印SQL语句

    1.在spring-mybatis.xml中配置语句 注意:value=”classpath:mybatis-config.xml”这个文件如果之前没有,是需要新建的  2.新建mybatis-con ...

  5. Hive启动失败

    启动hive报如下错误 [root@node01 conf]# hive19/03/31 09:57:31 WARN conf.HiveConf: HiveConf of name hive.meta ...

  6. java 使用jdbc连接Greenplum数据库和Postgresql数据库

    1.公司使用的Greenplum和Postgresql,确实让我学到不少东西.简单将使用jdbc连接Greenplum和Postgresql数据库.由于使用maven仓库,不能下载Greenplum的 ...

  7. Delphi Setlength 内存释放总结

    https://blog.csdn.net/lotusyangjun/article/details/8203521 一.在Setlength 被调用次数不多时,可直接使用以下代码进行释放var aa ...

  8. 关于浏览器对html, js,css的解析先后顺序的理解

    1.首先要了解页面的结构(包含哪些元素?哪些计算机语言能够在页面中运行 ) (1)html          不仅可以包含文字,还可以包含图片.链接,甚至音乐.程序等非文字元素的标记语言       ...

  9. 查询Linux系统中glibc的版本

    编写一个简单的程序 #include <stdio.h> int main() { printf("Hello world\n"); ; } 编译 gcc test.c ...

  10. python全栈开发day78、79 --bss项目

    一.回顾 1. BBS项目 CMS 1. 登录 1. form组件 2. auth模块 3. 验证码 2. 注册 1. form组件 1. 生成html代码 直接for循环form_obj,就能够遍历 ...