不错的题啊 挺好的结合了容斥和状压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. chrome flash插件改为自动运行

    1.情景展示 国内网页视频播放大部分用的都是flash插件,每次都要将默认改为允许,才能正常播放         能不能让flash插件在所有的网站上都能自动运行呢? 2.解决方案 第一步:打开fla ...

  2. 上手Caffe(二)

    @author:oneBite本文简述如何在windows环境下,运行caffe的“hello world”例程体会适用caffe的流程:转换输入数据格式>在solver.prototxt中配置 ...

  3. linux kernal oom killer 学习

    背景 我有2个定时任务,一个任务A是00:00开跑,另一个B是04:00开跑.正常情况下A会在2点多时候跑完,但是某一天因为某一步骤用的时间过久,导致4点还没跑完,这时候A内存占用大约在12g左右.4 ...

  4. # ML学习小笔记—Linear Regression

    Regression Output a scalar Model:a set of function 以Linear model为例 y = b+w * $x_cp$ parameters:b,W f ...

  5. hdu 1211 RSA (逆元)

    RSA Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submiss ...

  6. Codeforces Round #364 (Div. 1) 700B(树)

    题目大意 在n颗结点的树上有2k个需要配对的点,把他们两两配对,使得路程和最大并输出 选取一个点v lv表示v与父亲的边 那么考虑lv被经过的次数,对于一个最大的情况,lv应该为min(sv, 2*k ...

  7. TensorFlow 模型文件

    在这篇 TensorFlow 教程中,我们将学习如下内容: TensorFlow 模型文件是怎么样的? 如何保存一个 TensorFlow 模型? 如何恢复一个 TensorFlow 模型? 如何使用 ...

  8. BZOJ1017 [JSOI2008]魔兽地图DotR 【树形dp + 背包dp】

    题目链接 BZOJ1017 题解 orz hzwer 树形dp神题 设\(f[i][j][k]\)表示\(i\)号物品恰好花费\(k\)金币,并将\(j\)个物品贡献给父亲的合成时的最大收益 计算\( ...

  9. swiper使用案例一

    // 初始化函数 var mySwiper_a = new Swiper('.se3 .left', { direction: 'vertical', loop: true, autoplay: 50 ...

  10. idea创建maven项目需要注意的问题

    idea创建maven项目之后,我从deployment中看到报部署错误的问题,下图是解决问题的办法如下图所示: