若$\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. HTTP协议请求头信息和响应头信息

    阅读目录 http的请求部分 常用请头信息 常用响应头信息 http的请求部分 基本结构 请求行 GET  /test/hello.html HTTP/1.1 消息头(并不是每一次请求都一样) 空行 ...

  2. python爬虫点触验证码的识别思路(图片版)

  3. cmake方式使用vlfeat

    目录 environment statement compile vlfeat with cmake compile example project with cmake 1. make sure c ...

  4. PHP中self和this的用法区别

    PHP支持类和面向对象结构,PHP的类的静态函数和变量不与任何特定类的实例相关联(换句话说,一个对象).请看:类与对象的区别. 相反,静态函数和变量与类定义本身相关联.换言之,一个类的所有实例都共享相 ...

  5. vi不保存退出

    To quit the vi editor without saving any changes you've made If you are currently in insert or appen ...

  6. 一脸懵逼学习Hive的元数据库Mysql方式安装配置

    1:要想学习Hive必须将Hadoop启动起来,因为Hive本身没有自己的数据管理功能,全是依赖外部系统,包括分析也是依赖MapReduce: 2:七个节点跑HA集群模式的: 第一步:必须先将Zook ...

  7. webpack学习笔记--配置resolve

    Resolve Webpack 在启动后会从配置的入口模块出发找出所有依赖的模块,Resolve 配置 Webpack 如何寻找模块所对应的文件. Webpack 内置 JavaScript 模块化语 ...

  8. python爬虫实例

    import re import requests from bs4 import BeautifulSoup # 主方法 def main(): # 给请求指定一个请求头来模拟chrome浏览器 h ...

  9. 通过CSS自动截取字符串长度

      Table Tr TD的自动换行 <style type="text/css"> table { width: 30em; table-layout: fixed; ...

  10. 洛谷---小L和小K的NOIP考后放松赛

    链接: https://www.luogu.org/contestnew/show/11805?tdsourcetag=s_pcqq_aiomsg 题解: 没人过的题我就没看 t2: 考虑每个点是朋友 ...