BZOJ 2669- [cqoi2012]局部极小值
不错的题啊 挺好的结合了容斥和状压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]局部极小值的更多相关文章
- bzoj 2669 [cqoi2012]局部极小值 DP+容斥
2669: [cqoi2012]局部极小值 Time Limit: 3 Sec Memory Limit: 128 MBSubmit: 838 Solved: 444[Submit][Status ...
- BZOJ 2669 CQOI2012 局部极小值 状压dp+容斥原理
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2669 题意概述:实际上原题意很简洁了我就不写了吧.... 二话不说先观察一下性质,首先棋盘 ...
- ●BZOJ 2669 [cqoi2012]局部极小值
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=2669 题解: 容斥,DP,DFS 先看看 dp 部分:首先呢,X的个数不会超过 8个.个数很 ...
- 【BZOJ 2669】 2669: [cqoi2012]局部极小值 (状压DP+容斥原理)
2669: [cqoi2012]局部极小值 Time Limit: 3 Sec Memory Limit: 128 MBSubmit: 667 Solved: 350 Description 有一 ...
- bzoj2669[cqoi2012]局部极小值 容斥+状压dp
2669: [cqoi2012]局部极小值 Time Limit: 3 Sec Memory Limit: 128 MBSubmit: 774 Solved: 411[Submit][Status ...
- [BZOJ2669] [cqoi2012]局部极小值
[BZOJ2669] [cqoi2012]局部极小值 Description 有一个n行m列的整数矩阵,其中1到nm之间的每个整数恰好出现一次.如果一个格子比所有相邻格子(相邻是指有公共边或公共顶点) ...
- P3160 [CQOI2012]局部极小值
题目 P3160 [CQOI2012]局部极小值 一眼就是状压,接下来就不知道了\(qwq\) 做法 我们能手玩出局部小值最多差不多是\(8,9\)个的样子,\(dp_{i,j}\)为填满\(1~i\ ...
- P3160 [CQOI2012]局部极小值 题解(状压DP+容斥)
题目链接 P3160 [CQOI2012]局部极小值 双倍经验,双倍快乐 解题思路 存下来每个坑(极小值点)的位置,以这个序号进行状态压缩. 显然,\(4*7\)的数据范围让极小值点在8个以内(以下示 ...
- BZOJ 2669 Luogu P3160 [CQOI2012]局部极小值 (容斥原理、DP)
题目链接 (bzoj) https://www.lydsy.com/JudgeOnline/problem.php?id=2669 (luogu) https://www.luogu.org/prob ...
- BZOJ 2669 【CQOI2012】 局部极小值
题目链接:局部极小值 这是一道\(dp\)好题. 由于需要保证某些位置比周围都要小,那么我们可以从小到大把每个数依次填入,保证每个局部极小值填入之前周围都不能填,就只需要在加入的时候计数了. 由于局部 ...
随机推荐
- Webdriver--获得验证信息
title:获得当前页面的标题 current_url:获得当前页面的URL text:前面提到过,获得标签对的文本信息 try: couseTitle = driver.find_element_b ...
- [译]17-spring基于java代码的配置元数据
spring还支持基于java代码的配置元数据.不过这种方式不太常用,但是还有一些人使用.所以还是很有必要介绍一下. spring基于java代码的配置元数据,可以通过@Configuration注解 ...
- 关于用python作为第三方程序,来调用shell命令的问题,以及返回值格式解析
1.用python语言作为第三方,调用shell 在python2.x中,可以通过包commands来进行调用shell命令.如下: cmd就是你要调用的shell命令,把环境配置好,输入正确的命令格 ...
- KMS激活windows
slmgr /skms 106.0.6.209 slmgr /ato .查看当前系统是否永久激活,命令的作用是查看当前许可证状态的截止日期 slmgr.vbs -xpr 查看Windows正式版产品密 ...
- PAT——乙级1028
这道题花了我半个多小时,对呀乙级算是挺多时间的了. 1028 人口普查 (20 point(s)) 某城镇进行人口普查,得到了全体居民的生日.现请你写个程序,找出镇上最年长和最年轻的人. 这里确保每个 ...
- shell之ip命令
转:出处我也不知道了,学习时候记下的笔记 1.作用 ip是iproute2软件包里面的一个强大的网络配置工具,它能够替代一些传统的网络管理工具,例如ifconfig.route等,使用权限为超级用户. ...
- HDU 3111 Sudoku ( Dancing Links 精确覆盖模型 )
推荐两篇学DLX的博文: http://bbs.9ria.com/thread-130295-1-1.html(这篇对DLX的工作过程演示的很详细) http://yzmduncan.iteye.co ...
- Java 循环队列的实现
队列概念 队列(Queue)是限定只能在一端插入.另一端删除的线性表.允许删除的一端叫做队头(front),允许插入的一端叫做队尾(rear),没有元素的队列称为“空队列”. 队列具有先进先出(FIF ...
- AI人工客服开发 小程序智能客服 智能客服微信小程序 智能客服系统怎么做 如何设计智能客服系统
今天我们就来给大家分享下如何做 小程序的智能客服问答系统. 首先请确保你的小程序在线客服已经开通使用,并使用代码自己对接好了,将客户的提问自动做了拦截,拦截到了你自己开发的接口上. 做好了拦截以后,我 ...
- 获得touch事件,jquery绑定事件监听器,ios设备上打开touch状态以响应focus,active等伪类
2. 默认的监听方式 document.addEventListener('touchstart', function(){ alert('hello'); }, false); 使用jquery时 ...