洛谷$P$3160 局部极小值 $[CQOI2012]$ 状压$dp$
正解:状压$dp$
解题报告:
什么神仙题昂,,,反正我是没有想到$dp$的呢$kk$,,,还是太菜了$QAQ$
首先看数据范围,一个4×7的方格,不难想到最多有8个局部极小值,过于显然懒得证了$QwQ$
然后因为它对相对位置大小有要求,于是考虑按大小顺序枚举
这里考虑从小到大枚举好了$QwQ$
设$f_{i,j}:$枚举到第$i$个数,局部极小值的状态为$j$的方案数
转移显然就两种
第一种是,放到局部极小值的位置,有$f_{i,j+2^{k}}+=f_{i-1,j}$
第二种是,不放到局部最小值的位置,此时显然必须保证的是这个位置附近没有未填入的局部最小值的位置了,这个可以考虑先预处理出$g_{i}$表示局部极小值的状态为$i$时能填入的位置数量,有$f_{i,j}+=f_{i-1,j}\cdot g_{j}$
这时候要意识到一个问题_(:з」∠)_
就,因为它给的是所有局部最小值的位置,所以要考虑到,可能因为填法的不同,出现新的局部最小值的情况$QAQ$
这种显然一个容斥可以搞定,就再找出所有可能成为局部最小值而实际却并不是的位置,容斥掉就好$QwQ$
代码是不会有代码的$QAQ$
$over$
啊对了,发现这题还有个双重经验$QwQ$,也是黑的嘻嘻
#include<bits/stdc++.h>
using namespace std;
#define il inline
#define gc getchar()
#define ri register int
#define rc register char
#define rb register bool
#define rp(i,x,y) for(ri i=x;i<=y;++i)
#define my(i,x,y) for(ri i=x;i>=y;--i) const int N=,mod=;
int n,m,f[N*N][<<N],g[<<N],as,mvx[]={-,-,-,,,,,},mvy[]={-,,,-,,-,,},cnt,S;
bool mn[N][N],used[N][N];
char str[N];
struct node{int x,y;}nod[N*N]; il int read()
{
rc ch=gc;ri x=;rb y=;
while(ch!='-' && (ch>'' || ch<''))ch=gc;
if(ch=='-')ch=gc,y=;
while(ch>='' && ch<='')x=(x<<)+(x<<)+(ch^''),ch=gc;
return y?x:-x;
}
il int dp()
{
cnt=;memset(g,,sizeof(g));memset(f,,sizeof(f));
rp(i,,n)rp(j,,m)if(mn[i][j])nod[++cnt]=(node){i,j};S=<<cnt;
rp(i,,S-)
{
ri num=;memset(used,,sizeof(used));
rp(j,,cnt)
if(!((<<(j-))&i))
{
ri x=nod[j].x,y=nod[j].y;
if(!used[x][y])used[x][y]=,++num;
rp(k,,){ri tx=x+mvx[k],ty=y+mvy[k];if(tx && ty && tx<=n && ty<=m && !used[tx][ty])used[tx][ty]=,++num;}
}
g[i]=n*m-num;
}
f[][]=;
rp(i,,n*m)
{
rp(j,,S-)
{
(f[i][j]+=f[i-][j]*max(g[j]-i+,)%mod)%=mod;
rp(k,,cnt)if(!((<<(k-))&j))(f[i][j+(<<(k-))]+=f[i-][j])%=mod;
}
}
return f[n*m][S-];
}
void dfs(ri x,ri y,ri opt)
{
if(y>m)y=,++x;if(x>n)return void((as+=opt*dp())%=mod);
dfs(x,y+,opt);if(mn[x][y])return;
rp(i,,){ri tx=x+mvx[i],ty=y+mvy[i];if(!tx || !ty || tx>n || ty>m)continue;if(mn[tx][ty])return;}
mn[x][y]=;dfs(x,y+,opt*-);mn[x][y]=;
} int main()
{
//freopen("3160.in","r",stdin);freopen("3160.out","w",stdout);
n=read();m=read();rp(i,,n){scanf("%s",str+);rp(j,,m)mn[i][j]=str[j]=='X';}
dfs(,,);printf("%d",(as%mod+mod)%mod);
return ;
}
洛谷$P$3160 局部极小值 $[CQOI2012]$ 状压$dp$的更多相关文章
- war2 洛谷模拟赛day2 t3 状压
(new ) war2 题解:总体数据而言,我们很容易想到着就是DP啊,我们DP数组,用状态压缩,代表有那些点已经被占领过了,代表上一次我占的是那个.对于每一次状态转移,若当前我们要占领的Port ...
- 洛谷P2704 [NOI2001]炮兵阵地 [状压DP]
题目传送门 炮兵阵地 题目描述 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用“H” 表示),也可能是平原(用“P”表示),如下图 ...
- 洛谷P2831 愤怒的小鸟——贪心?状压DP
题目:https://www.luogu.org/problemnew/show/P2831 一开始想 n^3 贪心来着: 先按 x 排个序,那么第一个不就一定要打了么? 在枚举后面某一个,和它形成一 ...
- 洛谷P2051 [AHOI2009] 中国象棋(状压dp)
题目简介 n*m的棋盘,对每行放炮,要求每行每列炮数<=2,求方案数%9999973 N,M<=100 题目分析 算法考虑 考虑到N,M范围较小,每一行状态只与前面的行状态有关,考虑状压D ...
- K - Painful Bases 状压dp
Painful Bases LightOJ - 1021 这个题目一开始看,感觉有点像数位dp,但是因为是最多有16进制,因为限制了每一个数字都不同最多就有16个数. 所以可以用状压dp,看网上题解是 ...
- 二:状压dp
一:状压dp的基本特征 状态压缩问题一般是指用十进制的数来表示二进制下的状态 这种用一个数来表示一组数,以降低表示状态所需的维数的解题手段,就叫做状态压缩. 常用到位运算 二:位运算 &:与运 ...
- poj2411 Mondriaan's Dream[简单状压dp]
$11*11$格子板上铺$1*2$地砖方案.以前做过?权当复习算了,毕竟以前学都是浅尝辄止的..常规题,注意两个条件:上一行铺竖着的则这一行同一位一定要铺上竖的,这一行单独铺横的要求枚举集合中出现连续 ...
- 洛谷P4289 移动玩具 HAOI2008 搜索+状压
正解:状压 解题报告: 先,放下传送门QwQ 说真的我jio得这题不管是思路还是实现上,都还是有一定难度的?然后就看到神仙hl博客里一句"太水了不讲了"就过掉了,,,好的趴太强辽Q ...
- 状压dp大总结1 [洛谷]
前言 状态压缩是一种\(dp\)里的暴力,但是非常优秀,状态的转移,方程的转移和定义都是状压\(dp\)的难点,本人在次总结状压dp的几个题型和例题,便于自己以后理解分析状态和定义方式 状态压缩动态规 ...
随机推荐
- @bzoj - 4377@ [POI2015] Kurs szybkiego czytania
目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定 n, a, b, p,其中 n, a 互质.定义一个长度为 ...
- uni-app禁止滑动穿透
<view class="topWrapper" v-show="chooseShow" @click="chooseShow = false& ...
- Tyvj-1338 QQ农场
P1338 QQ农场 时间: 1000ms / 空间: 131072KiB / Java类名: Main 背景 Sandytea前段时间沉迷于QQ农场中……一天夜里,他梦见来到好友X的农场上…… 描述 ...
- 高级PHP开发:利用PHPEMS搭建在线考试平台
今天给大家分享一个小技巧,就是利用PHP ems搭建在线考试平台:希望能给你给予帮助: 在给大家分享之前,这里推荐下我自己建的PHP开发-VIP资料出售平台 :638965404,不管你是小白还是大牛 ...
- oracle 用EXISTS替代IN
在许多基于基础表的查询中,为了满足一个条件,往往需要对另一个表进行联接.在这种情况下, 使用EXISTS(或NOT EXISTS)通常将提高查询的效率. 低效: SELECT * FROM EMP ( ...
- hdu 1016 Prime Ring Problem(dfs)
Prime Ring Problem Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...
- HDU 2844 混合背包、
题意:一个人想买手表,给你n个价值的硬币,然后给你n个价值硬币对应的个数.但是呢,这个人只知道这个手表的价格不超过m元.问他最多能买多少种价值的手表 思路:dp背包专题 但是- - 一直不知道该怎么d ...
- 基于BERT预训练的中文命名实体识别TensorFlow实现
BERT-BiLSMT-CRF-NERTensorflow solution of NER task Using BiLSTM-CRF model with Google BERT Fine-tuni ...
- H3C 帧中继子接口
- Flex AIR应用换肤功能(Android和IOS)
说明 换肤功能,即将整个应用的皮肤都进行更换,其实质,是动态加载swf文件的过程,而这些swf文件则有css文件编译而来. 关于换肤功能,在android和ios系统的实现方式是不同的.主要原因,是因 ...