hdu5079
这道题的难点在于思考dp表示什么
首先可以令ans[len]表示白色子矩阵边长最大值大于等于len的方案数则ans[len]-ans[len+1]就是beautifulness为len的方案数
白色子矩阵边长最大值大于等于len的方案数=总方案-白色子矩阵边长最大值小于len的方案数
经过这样的转化,我们就好dp了,我们先穷举len
令f[i][st]表示到第i行,状态为st的白色子矩阵边长最大值小于len的方案数
怎么设计状态呢,由于要保证白色子矩阵边长最大值小于len
我们维护一个n-len+1的len进制数,第j位表示(i,j)~(i,j+len-1)中向上延伸的白色格子数的最小值
这样我们二进制穷举每行的涂色方法就可以转移状态了
#include<bits/stdc++.h> using namespace std;
typedef long long ll;
const int mo=1e9+;
int d[],a[],ans[],v[],n;
char s[];
void inc(int &a,int b)
{
a+=b;
if (a>mo) a-=mo;
} struct node
{
int st[],c[],len;
void clr()
{
for (int i=; i<=len; i++) c[st[i]]=;
len=;
}
void push(int nw,int w)
{
if (!c[nw]) st[++len]=nw;
inc(c[nw],w);
}
} f[];
int main()
{
int cas;
scanf("%d",&cas);
f[].len=f[].len=;
while (cas--)
{
int m=;
scanf("%d",&n);
for (int i=; i<=n; i++)
{
scanf("%s",s);
a[i]=;
for (int j=; j<n; j++)
if (s[j]=='o') m=m*%mo;
else a[i]|=(<<j);
}
ans[]=;
ans[]=(m-+mo)%mo;
for (int l=; l<=n; l++)
{
int p=,k=n+-l;
d[]=;
for (int i=; i<=n; i++) d[i]=d[i-]*l;
f[].clr();
f[].push(,);
for (int i=; i<=n; i++)
{
p^=;
f[p].clr();
for (int cur=; cur<(<<n); cur++)
{
if (cur&a[i]) continue;
for (int r=; r<k; r++) v[r]=;
for (int r=; r<n; r++)
{
if ((cur>>r)&) continue;
for (int j=; j<k; j++)
if (r>=j&&r<j+l) v[j]=;
}
for (int j=; j<=f[p^].len; j++)
{
int pre=f[p^].st[j],nw=;
int w=f[p^].c[pre];
for (int r=; r<k; r++)
{
int x=pre%l; pre/=l;
if (v[r]) continue;
if (x==l-) {nw=-; break;}
nw+=(x+)*d[r];
}
if (nw>-) f[p].push(nw,w);
}
}
}
ans[l]=;
for (int i=; i<=f[p].len; i++)
{
int x=f[p].st[i];
inc(ans[l],f[p].c[x]);
}
ans[l]=(m-ans[l]+mo)%mo;
ans[l-]=(ans[l-]-ans[l]+mo)%mo;
}
for (int i=; i<=n; i++)
printf("%d\n",ans[i]);
}
}
hdu5079的更多相关文章
随机推荐
- ubuntu16.04 装了一天的gitlab
1.安装gitlab baidu安装完了[后续再自己写安装过程] 2.遇到的问题 访问gitlab http://ip 可以进入页面也能操作但是console报404无法加载js和css,这样很不方便 ...
- Spark中如何生成Avro文件
研究spark的目的之一就是要取代MR,目前我司MR的一个典型应用场景即为生成Avro文件,然后加载到HIVE表里,所以如何在Spark中生成Avro文件,就是必然之路了. 我本人由于对java不熟, ...
- 【Python】python之Character string
1.python字符串 字符串是 Python 中最常用的数据类型.我们可以使用引号('或")来创建字符串,l Python不支持单字符类型,单字符也在Python也是作为一个字符串使用. ...
- OJ 列表
维护一个 OJ 列表.(这件事似乎没啥意义?) AtCoder hihoCoder Codeforces DMOJ CodeChef CS Academy HackerRank HackerEarth ...
- BZOJ 2707: [SDOI2012]走迷宫 拓扑+高斯消元+期望概率dp+Tarjan
先Tarjan缩点 强连通分量里用高斯消元外面直接转移 注意删掉终点出边和拓扑 #include<cstdio> #include<cstring> #include<a ...
- 如何使用Photoshop制作真实的尺子
前言: 日常生活中经常性的偶尔需要测量一些东西的尺寸,但刚好手头上缺乏尺子等必要的测量工具,这时候其实我们可以利用Photoshop,临时制作一把基于现实物理单位(如:厘米)的虚拟尺子. 难点: 像素 ...
- at用法小记
By francis_hao Aug 22,2017 at – 设置稍后执行的作业. 概要 at [-V] [-f file] [-mMlv] timespec...at [-V] [-f ...
- linux bash学习(一)
1.请你以 read 指令的用途,撰写一个 script ,他可以让使用者输入:1. first name 与 2. last name, 最后并且在屏幕上显示:“Your full name is: ...
- ERROR: Found lingering reference file hdfs
Found lingering reference异常 ERROR: Found lingering reference file hdfs://jiujiang1:9000/hbase/month_ ...
- java 保护内存操作的方法
1.与c++不同,在java中,没有通过使用强制转换指针类型或者通过进行指针运算直接访问内存的方法.在java中使用对象时,需要严格地遵守类型规则.如果存在一个Mountain类对象的引用(类似于c+ ...