不错的题啊 挺好的结合了容斥和状压DP

保证每个数各不相同,又有大小关系,那么就可以将数字从小到大填。

不难发现 局部极小值<=8,这个可以状压,f[i][j] 表示填了前i个数,局部极小值被填的状态是j的方案数。

转移时预处理数组p[j]表示当局部极小值的填写状态为j时有哪些位置可以填数。

枚举当前数是否填在局部极小值的位置上。

f[i][j]=f[i-1][j]*(p[j]-i+1)+f[i-1][k]

然后 会有不是局部最小值的点成为局部最小值的情况 我们就用容斥来减掉这些情况

用dfs来枚举那些点成为了局部最小值 然后状压DP就好 不难发现 dfs的方案数其实是挺少的

#include<bits/stdc++.h>
#define me(a,x) memset(a,x,sizeof a)
using namespace std;
const int mod=12345678;
const int dx[9]={0,0,1,1,1,-1,-1,-1,0};
const int dy[9]={1,-1,1,-1,0,1,-1,0,0};
inline int read(){
char ch=getchar(); int x=0,f=1;
while(ch<'0'||ch>'9'){if(ch=='-')f=-1; ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0'; ch=getchar();}
return x*f;
}
char s[6][9]; int n,m,f[30][1<<8],ans,p[1<<8];
struct P{int x,y;}a[10];
int dp()
{
me(f,0); me(p,0); int tp=0,i,j,k,t;
for(i=1;i<=n;i++)for(j=1;j<=m;j++)
if(s[i][j]=='X')a[++tp]=(P){i,j};
for(t=0;t<(1<<tp);t++){
bool v[6][9]; me(v,0);
for(i=1;i<=tp;i++)
if(~t&(1<<i-1)) v[a[i].x][a[i].y]=1;
for(i=1;i<=n;i++)for(j=1;j<=m;j++){
for(k=0;k<9;k++)
if(v[i+dx[k]][j+dy[k]])break;
if(k>8)p[t]++;
}
}
f[0][0]=1;
for(i=1;i<=n*m;i++)for(t=0;t<(1<<tp);t++)
{
(f[i][t]+=(long long)f[i-1][t]*max(p[t]-i+1,0)%mod)%=mod;
for(j=1;j<=tp;j++)
if(t&(1<<j-1))(f[i][t]+=f[i-1][t^(1<<j-1)])%=mod;
}
return f[n*m][(1<<tp)-1];
}
void dfs(int x,int y,int cnt){
if(y==m+1){dfs(x+1,1,cnt); return;}
if(x==n+1){
(ans+=dp()*(cnt&1?-1:1))%=mod;
return;
}
dfs(x,y+1,cnt); int k;
for(k=0;k<9;k++)if(s[dx[k]+x][dy[k]+y]=='X')break;
if(k>8){s[x][y]='X'; dfs(x,y+1,cnt+1); s[x][y]='.';}
}
int main()
{
n=read(),m=read(); int i,j,k;
for(i=1;i<=n;i++)scanf("%s",s[i]+1);
for(i=1;i<=n;i++)for(j=1;j<=m;j++)if(s[i][j]=='X')
for(k=0;k<8;k++)
if(s[dx[k]+i][dy[k]+j]=='X')
return puts("0"),0;
dfs(1,1,0);
printf("%d\n",(ans+mod)%mod);
return 0;
}

BZOJ 2669- [cqoi2012]局部极小值的更多相关文章

  1. bzoj 2669 [cqoi2012]局部极小值 DP+容斥

    2669: [cqoi2012]局部极小值 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 838  Solved: 444[Submit][Status ...

  2. BZOJ 2669 CQOI2012 局部极小值 状压dp+容斥原理

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2669 题意概述:实际上原题意很简洁了我就不写了吧.... 二话不说先观察一下性质,首先棋盘 ...

  3. ●BZOJ 2669 [cqoi2012]局部极小值

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=2669 题解: 容斥,DP,DFS 先看看 dp 部分:首先呢,X的个数不会超过 8个.个数很 ...

  4. 【BZOJ 2669】 2669: [cqoi2012]局部极小值 (状压DP+容斥原理)

    2669: [cqoi2012]局部极小值 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 667  Solved: 350 Description 有一 ...

  5. bzoj2669[cqoi2012]局部极小值 容斥+状压dp

    2669: [cqoi2012]局部极小值 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 774  Solved: 411[Submit][Status ...

  6. [BZOJ2669] [cqoi2012]局部极小值

    [BZOJ2669] [cqoi2012]局部极小值 Description 有一个n行m列的整数矩阵,其中1到nm之间的每个整数恰好出现一次.如果一个格子比所有相邻格子(相邻是指有公共边或公共顶点) ...

  7. P3160 [CQOI2012]局部极小值

    题目 P3160 [CQOI2012]局部极小值 一眼就是状压,接下来就不知道了\(qwq\) 做法 我们能手玩出局部小值最多差不多是\(8,9\)个的样子,\(dp_{i,j}\)为填满\(1~i\ ...

  8. P3160 [CQOI2012]局部极小值 题解(状压DP+容斥)

    题目链接 P3160 [CQOI2012]局部极小值 双倍经验,双倍快乐 解题思路 存下来每个坑(极小值点)的位置,以这个序号进行状态压缩. 显然,\(4*7\)的数据范围让极小值点在8个以内(以下示 ...

  9. BZOJ 2669 Luogu P3160 [CQOI2012]局部极小值 (容斥原理、DP)

    题目链接 (bzoj) https://www.lydsy.com/JudgeOnline/problem.php?id=2669 (luogu) https://www.luogu.org/prob ...

  10. BZOJ 2669 【CQOI2012】 局部极小值

    题目链接:局部极小值 这是一道\(dp\)好题. 由于需要保证某些位置比周围都要小,那么我们可以从小到大把每个数依次填入,保证每个局部极小值填入之前周围都不能填,就只需要在加入的时候计数了. 由于局部 ...

随机推荐

  1. maven中mapper.xml不发布的问题

    在自定义的包中定义了mapper.xml然后利用mybatis的扫描包形式来动态创建mapper 开启工程报错: 说无效的绑定 原因: 发布的war中,工程包中的mapper根本就没有出现在class ...

  2. .export*读取图片

    *读取图片 read_image(Image,'D:/MyFile/halcon/数字识别/1.jpg define PHYS_FLASH2_1 0xBC000000 /* Image2 Bank # ...

  3. springmvc maven搭建二之springmvc的security

    上一篇文档初步搭建了一个springmvc的web工程,现在要来实现第二步咯.将登录校验整合到项目中,我用的是spring 3.0.2的版本,所以这里的登录用了security来处理.不多说,上代码. ...

  4. ThreadPoolExecutor源码解析

    LZ目前正在做一个批量生成报表的系统,需要定时批量生成多张报表,便考虑使用线程池来完成.JDK自带的Executors工具类只提供创建固定线程和可伸展但无上限的两个静态方法,并不能满足LZ想自定制线程 ...

  5. Tomcat学习笔记(十三)

    服务器组件和服务组件 服务器组件 org.apache.catalina.Server接口的实例表示Catalina的整个servlet引擎,包含了所有的组件.使用一种优雅的方法来启动/关闭整个系统, ...

  6. ServletContext结合Servlet接口中的init()方法和destroy()方法的运用----网站计数器

    我们一般知道Servlet接口中的init()方法在tomcat启动时调用,destroy()方法在tomcat关闭时调用.那么这两个方法到底在实际开发中有什么作用呢?这就是这个随笔主要讲的内容. 思 ...

  7. [1]区分event对象中的[clientX,offsetX,screenX,pageX]

    前言 在平时的开发中,非常讨厌的就是兼容性了,兼容性的问题总会让我们记忆混淆,所以这次来区分一下event对象中的常用获取鼠标位置. clientX clientY event.clientXeven ...

  8. 简易web服务器(npm)

    npm install -g http-server 以后可以在任何一个文件夹启动静态文件的访问通过http-server -a localhost -p 8000ctrl + c结束 http-se ...

  9. linux 某个路径创建快捷方式

    ln -s /绝对路径   桌面名称

  10. 【bzoj3211】花神游历各国&&【bzoj3038】上帝造题的七分钟2

    bzoj3038]上帝造题的七分钟2 Description XLk觉得<上帝造题的七分钟>不太过瘾,于是有了第二部. “第一分钟,X说,要有数列,于是便给定了一个正整数数列. 第二分钟, ...