P3160 [CQOI2012]局部极小值
题目
P3160 [CQOI2012]局部极小值
一眼就是状压,接下来就不知道了\(qwq\)
做法
我们能手玩出局部小值最多差不多是\(8,9\)个的样子,\(dp_{i,j}\)为填满\(1~i\)数字,局部小值的状态为\(j\)
第\(k\)个局部极小值填\(i\):\(dp[i][j]=(dp[i][j]+dp[i-1][j^(1<<k-1)])%p\)
不填在局部极小值,显然有些地方不能填\(i\)的,首先还没填的局部极小值不填,其周围也不能填(填\(i\)后后面再填比不符合局部极小值)
我们预处理出每种状态不能填时的位置:\(dp[i][j]=(dp[i][j]+dp[i-1][j]*max(num[j]-i+1,0))%p\)
一顿操作后发现WA了,我们得到的局部极小值可能不是恰好是给出的\(X\)(更多)
容斥原理:Ans=至少多0个极小值-至少多1个极小值+至少多两个极小值......
理解:至少多0个\((x,x+1,x+2,x+3...)-k(x+1,x+2,x+3...)\)其中\(k\)为某些值的系数
填了至少多0个极小值后,有多填的部分那就得减去至少多1个极小值,至少多1个极小值的位置也有很多,就会有一些位置减掉的系数为(k>1),就要又加上
\(dfs\)时加上能被多余的极小值填上的地方换成'X',然后多次做\(dp\)
My complete code
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
typedef long long LL;
const int maxn=31;
const int p=12345678;
const int dx[8]={-1,-1,-1,0,1,1,1,0},dy[8]={-1,0,1,1,1,0,-1,-1};
int n,m,tot;
LL ans;
int x[maxn],y[maxn],num[1<<9],dp[maxn][1<<9];
bool visit[maxn][maxn];
char s[maxn][maxn];
inline int Solve(){tot=0;for(int i=1;i<=n;++i)for(int j=1;j<=m;++j)if (s[i][j]=='X')x[++tot]=i,y[tot]=j;int Up=1<<tot;for(int i=0;i<Up;i++){int cnt(0);memset(visit,0,sizeof(visit));for(int j=1;j<=tot;++j)if(!((i>>(j-1))&1)){visit[x[j]][y[j]]=1;for(int k=0;k<8;++k){int xx=x[j]+dx[k];int yy=y[j]+dy[k];if(xx>0&&yy>0&&xx<=n&&yy<=m)visit[xx][yy]=1;}}for(int j=1;j<=n;++j)for(int k=1;k<=m;++k) if(visit[j][k]) ++cnt;num[i]=n*m-cnt;}memset(dp,0,sizeof(dp));dp[0][0]=1;for(int i=1;i<=n*m;++i)for(int j=0;j<Up;++j){dp[i][j]=(dp[i][j]+dp[i-1][j]*max(num[j]-i+1,0))%p;for(int k=1;k<=tot;k++)if(j&(1<<(k-1)))dp[i][j]=(dp[i][j]+dp[i-1][j^(1<<k-1)])%p;}return dp[n*m][Up-1];
}
void Dfs(int x,int y,int k){if(y==m+1){Dfs(x+1,1,k);return;}if(x==n+1){ans=(ans+(((k&1)==0)?1:-1)*Solve()+p)%p;return;}Dfs(x,y+1,k);if(s[x][y]!='X'){bool f=true;for(int i=0;i<8;i++)if(s[x+dx[i]][y+dy[i]]=='X'){f=false;break;}if(f){s[x][y]='X',Dfs(x,y+1,k+1),s[x][y]='.';}}
}
int main(){scanf("%d%d",&n,&m);for(int i=1;i<=n;i++)scanf(" %s",s[i]+1);Dfs(1,1,0);printf("%lld\n",ans);return 0;
}
/*
5 5
.....
...X.
.X...
.....
....X
*/
转载于:https://www.cnblogs.com/y2823774827y/p/10262116.html
P3160 [CQOI2012]局部极小值相关推荐
- BZOJ 2669 Luogu P3160 [CQOI2012]局部极小值 (容斥原理、DP)
题目链接 (bzoj) https://www.lydsy.com/JudgeOnline/problem.php?id=2669 (luogu) https://www.luogu.org/prob ...
- [CQOI2012] 局部极小值(状压DP + 容斥 + 搜索)
problem luogu-P3160 solution 这么小的数据范围,非暴力不状压.暴力 O(28!)O(28!)O(28!) 呵呵呵可以拉走了. 我们不妨从小到大填数字,这样如果局部极小值点还 ...
- [CQOI2012]局部极小值
嘟嘟嘟 谁说CQOI的题都是板儿题,我就觉得这题挺难的-- 看到数据范围这么小,就会想状压.然而\(2 ^ {28}\)肯定过不了.不过对于所有的极小值的格子,最多不会超过8个,所以我们状压选了哪些局 ...
- ●BZOJ 2669 [cqoi2012]局部极小值
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=2669 题解: 容斥,DP,DFS 先看看 dp 部分: 首先呢,X的个数不会超过 8个. 个 ...
- P3160:局部极小值(容斥、状压)
解析 又是一道我不会的容斥题 qwq 本题的一个关键性质:答案有解时,极小值不超过8个 所以可以对其进行状压 考虑从小到大填数 那么在极小值填完之前,它的八连通必然是不能填的 设计dpi,sdp_{i ...
- 2019.2-2019.3 TO-DO LIST
DP P2723 丑数 Humble Numbers(完成时间:2019.3.1) P2725 邮票 Stamps(完成时间:2019.3.1) P1021 邮票面值设计(完成时间:2019.3.1) ...
- 【BZOJ-2669】局部极小值 状压DP + 容斥原理
2669: [cqoi2012]局部极小值 Time Limit: 3 Sec Memory Limit: 128 MB Submit: 561 Solved: 293 [Submit][Stat ...
- Java项目迁移到uap上_Tomcat启动,不能加载项目问题。
[BZOJ-2669]局部极小值 状压DP + 容斥原理 2669: [cqoi2012]局部极小值 Time Limit: 3 Sec Memory Limit: 128 MBSubmit: 56 ...
- 灭霸消灭一般人口是随即的吗_是时候消灭皇家战斗风格了
灭霸消灭一般人口是随即的吗 Fortnite was my first battle royale, as I'm sure it was for many. I thought at the tim ...
最新文章
- python获取文件路径
- iptables中state模块的连接状态
- python3生成随机数_Python3.3中如何产生伪随机数
- HTML实现包含公共部分:通过ECMA6的模块化,纯前端实现类似jsp:include的功能
- Java教程:SpringBoot常用配置
- 电信信息日志使用mapreduce统计的两种方式
- 远控免杀5---Veil免杀
- 云计算技术的跃进睿云智合专业先进水平
- 实验七-卷积编码的MATLAB实现
- IM多点登录与消息漫游架构随想
- Spring 缓存大法
- 006Python-Re库入门(正则表达式)
- 一个程序媛的古北水镇游览攻略
- 小米盒子,一个说皇帝没穿衣服的小孩
- 【摘抄】放弃表达的瞬间
- 我的ubuntu(持续更新中)
- 2020年阴历三月初一 投资理财~有些大v要警惕
- Python diag函数
- Inconsistent namespace mapping properties. Cannot initiate connection as SYS
- Human vs AI,人类和机器的学习究竟谁更胜一筹?
热门文章
- ART、JIT、AOT、Dalvik之间有什么关系?
- 又一个半成品库 weblog rpc client
- perform update operations on columns of type JSONB
- 如何把Excel的多张表格合成一张
- javascript简易缓动插件
- 看贴回帖 感受与感动
- LeetCode 5352. 生成每种字符都是奇数个的字符串
- TCP/IP网络编程(2)
- socket bufferedinputstream通信读取不到服务器返回的响应_TCP角度看socket通信过程,socket怎么表示三次握手,四次挥手...
- python3九九乘法表儿歌_python3: 简单4步骤输出九九乘法表