不错的题啊 挺好的结合了容斥和状压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. Python 两种方式实现斐波那契数列

    斐波那契数列指的是这样一个数列 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946 ...

  2. (原)Unreal渲染相关的缓冲区 及其 自定义代码几种抓取

    @authot: 白袍小道   转载说明那啥即可. (图片和本文无关,嘿嘿,坑一下)         以下为Unreal4.18版本中对GPUBuffer部分的分析结果 (插入:比之够着,知至目的) ...

  3. 【志银】#define lowbit(x) ((x)&(-x))原理详解

    分析下列语句 #define lowbit(x) ((x)&(-x)) 可写成下列形式: int Lowbit(x) { return x&(-x); } 例1:x = 1 十进制转二 ...

  4. 【志银】NYOJ《题目524》A-B Problem

    题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=860 My思路: 先用两个字符串储存这两个实数,然后再用另外两个字符串储存去掉符号和前后多 ...

  5. 【bzoj1179】[Apio2009]Atm Tarjan缩点+Spfa最长路

    题目描述 输入 第一行包含两个整数N.M.N表示路口的个数,M表示道路条数.接下来M行,每行两个整数,这两个整数都在1到N之间,第i+1行的两个整数表示第i条道路的起点和终点的路口编号.接下来N行,每 ...

  6. [codevs1746][NOI2002]贪吃的九头龙

    [codevs1746][NOI2002]贪吃的九头龙 试题描述 传说中的九头龙是一种特别贪吃的动物.虽然名字叫"九头龙",但这只是说它出生的时候有九个头,而在成长的过程中,它有时 ...

  7. spring的applicationContext.xml如何自动加载

    一个web工程自动加载的配置文件只有web.xml,想要加载其他.xml必须在web.xml里面进行配置. 用spring的时候需要一个bean容器来管理所有的bean,所有bean默认是写在appl ...

  8. mysql 逻辑架构(三层)

    1.客户端(主要处理连接,授权认证,安全等). 2.MYSQL服务器层(核心服务功能都在这层,包括,查询解析,分析,优化,缓存以及所有的内置函数,所有跨存储引擎的功能都在这层实现:存储过程,触发器,视 ...

  9. win7 iis 7.0 碰到 503错误,找到的解决方案

    Service Unavailable HTTP Error 503. The service is unavailable. 今天要布署一个网站,在自己的电脑上,结果碰到服务器503错误,找应用程序 ...

  10. 【GDI+】MFC画图- 消除锯齿(转)

    原文转自 https://wenku.baidu.com/view/b5460979700abb68a982fbcf.html 在常规条件下,MFC画出来的图形.文字都是有锯齿的.如下图所示: 怎样才 ...