不错的题啊 挺好的结合了容斥和状压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. Jmeter编码问题

    问题现象:1.利用csv data set config参数化数据后,在beanshell中引用,能正常引用到,但是传给服务器时,还是报手机号格式不对 将jmeter日志级别打成debug(jmete ...

  2. 第二阶段团队冲刺-two

    昨天: 处理第一次启动服务器500的问题. 今天: 修复博客作业查询功能. 遇到的问题: 无.

  3. kibana的查询语法

    kibana的查询语法是    字段Fields:关键词

  4. PHP session 与cookie

    知识点: session是将服务器将网页产生的会话信息以数组形式存到一个php文件中,产生的全局变量,可以在系统下的其他网页任意调用这个数据. cookie类似于session原理,但是是将数据存给用 ...

  5. sqlserver 汉字转拼音 索引 函数

    IF OBJECT_ID('[fn_GetPinyin]') IS NOT NULL DROP FUNCTION [fn_GetPinyin] GO create function [dbo].[fn ...

  6. LOJ #124. 除数函数求和 1

    题目描述 $\sigma_k(n) = \sum_{d | n} d ^ k$​ 求 $\sum_{i=1}^n\sigma_k(i)$ 的值对 109 取模的结果. 输入格式 第一行两个正整数 n, ...

  7. 【CZY选讲·Triangle】

    题目描述 长度为的铁丝,你可以将其分成若干段,并把每段都折成一个三角形.你还需要保证三角形的边长都是正整数并且三角形两两相似,问有多少种不同的分法. 数据范围 1≤≤10^6 题解:      ①相 ...

  8. wordpress对使用的国外主题进行本地汉化

    wordpress有非常多优秀与专业的主题,当然大多数是非中文的 这些主题本身总会有些无法通过wordpress admin后台来配置的在页面上的英文输出 此时你可以去对应的代码去改掉那些输出,不过这 ...

  9. mysql 连接失败问题汇集

    FHost '192.168.5.128' is not allowed to connect to this MySQL serverConnection closed by foreign hos ...

  10. QLineEdit使用总结(转)

    本文转自 https://www.cnblogs.com/hellovenus/p/5183593.html