若$\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. POJ 2001 Shortest Prefixes(字典树活用)

    Shortest Prefixes Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 21651   Accepted: 927 ...

  2. sqoop无法导出parquet文件到mysql

    1.问题描述 在CDH集群中我们需要将Hive表的数据导入到RDBMS数据库中,使用Sqoop工具可以方便的将Hive表数据抽取到RDBMS数据库中,在使用Sqoop抽取Hive Parquet表时作 ...

  3. JAVA二分搜索树

    二叉树: 和链表一样,动态数据结构. 二叉树具有唯一根节点 二叉树具有天然的递归结构 二分搜索树是二叉树 二分搜索树的每个节点的值: 1.大于其左子树的所有节点的值 2.小于其右子树的所有节点的值 每 ...

  4. 关于K8S证书生成方面的脚本草稿

    周日在家里计划的. 俺不加班,但在家学习的时间一样没少! 还没弄完,只粗粗弄了etcd证书. #! /usr/bin/env bash set -e set -u set -x THIS_HOST=$ ...

  5. canvas给图片加水印

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. 1个汉字在UTF-8编码占3个字节

    http://blog.csdn.net/ns_code/article/details/14162087 http://www.ruanyifeng.com/blog/2007/10/ascii_u ...

  7. 设置sde表空间为自动增长

    有的用户在测试数据时,希望在SDE表空间里面不受限制地导入数据,于是需要将SDE的表空间设置为自动增长. 过程描述 1.可以在创建sde表空间的时候,添加参数Autoextend on,修改后创建命令 ...

  8. ifconf家族命令

    1  ifconfig 命令: ifconfig 命令用来查看和配置网络设备.当网络环境发生改变时可通过此命令对网络进行相应的配置. 查看: ifconfig : 显示正在激活中的网卡 ifconfi ...

  9. Python图表数据可视化Seaborn:1. 风格| 分布数据可视化-直方图| 密度图| 散点图

    conda  install seaborn  是安装到jupyter那个环境的 1. 整体风格设置 对图表整体颜色.比例等进行风格设置,包括颜色色板等调用系统风格进行数据可视化 set() / se ...

  10. day28 面向对象:反射,内置函数,类的内置方法

    面向对象进阶博客地址链接: http://www.cnblogs.com/Eva-J/articles/7351812.html 复习昨日内容: # 包 # 开发规范 # # hashlib # 登录 ...