正解:状压$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$的更多相关文章

  1. war2 洛谷模拟赛day2 t3 状压

    (new )   war2 题解:总体数据而言,我们很容易想到着就是DP啊,我们DP数组,用状态压缩,代表有那些点已经被占领过了,代表上一次我占的是那个.对于每一次状态转移,若当前我们要占领的Port ...

  2. 洛谷P2704 [NOI2001]炮兵阵地 [状压DP]

    题目传送门 炮兵阵地 题目描述 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用“H” 表示),也可能是平原(用“P”表示),如下图 ...

  3. 洛谷P2831 愤怒的小鸟——贪心?状压DP

    题目:https://www.luogu.org/problemnew/show/P2831 一开始想 n^3 贪心来着: 先按 x 排个序,那么第一个不就一定要打了么? 在枚举后面某一个,和它形成一 ...

  4. 洛谷P2051 [AHOI2009] 中国象棋(状压dp)

    题目简介 n*m的棋盘,对每行放炮,要求每行每列炮数<=2,求方案数%9999973 N,M<=100 题目分析 算法考虑 考虑到N,M范围较小,每一行状态只与前面的行状态有关,考虑状压D ...

  5. K - Painful Bases 状压dp

    Painful Bases LightOJ - 1021 这个题目一开始看,感觉有点像数位dp,但是因为是最多有16进制,因为限制了每一个数字都不同最多就有16个数. 所以可以用状压dp,看网上题解是 ...

  6. 二:状压dp

    一:状压dp的基本特征 状态压缩问题一般是指用十进制的数来表示二进制下的状态 这种用一个数来表示一组数,以降低表示状态所需的维数的解题手段,就叫做状态压缩. 常用到位运算 二:位运算 &:与运 ...

  7. poj2411 Mondriaan's Dream[简单状压dp]

    $11*11$格子板上铺$1*2$地砖方案.以前做过?权当复习算了,毕竟以前学都是浅尝辄止的..常规题,注意两个条件:上一行铺竖着的则这一行同一位一定要铺上竖的,这一行单独铺横的要求枚举集合中出现连续 ...

  8. 洛谷P4289 移动玩具 HAOI2008 搜索+状压

    正解:状压 解题报告: 先,放下传送门QwQ 说真的我jio得这题不管是思路还是实现上,都还是有一定难度的?然后就看到神仙hl博客里一句"太水了不讲了"就过掉了,,,好的趴太强辽Q ...

  9. 状压dp大总结1 [洛谷]

    前言 状态压缩是一种\(dp\)里的暴力,但是非常优秀,状态的转移,方程的转移和定义都是状压\(dp\)的难点,本人在次总结状压dp的几个题型和例题,便于自己以后理解分析状态和定义方式 状态压缩动态规 ...

随机推荐

  1. YUI css reset

    *{ margin:0; padding:0; } 以前写CSS都会在会在样式的开头部分添加上述的内容,今天才发现这种写法很不友好,会导致很多样式显示问题,所以并不适合所有的浏览器. 下面的是雅虎的c ...

  2. 微信小程序之购物车demo

    这篇小demo主要使用了一下几个技术点 1.全局变量的使用 在这里定义的变量 任何一个页面和组件都可以访问到 在使用到的页面 const app = getApp(); 声明一个实例 然后 app.g ...

  3. android学习——Android Layout标签之-viewStub,requestFocus,merge,include

    定义Android Layout(XML)时,有四个比较特别的标签是非常重要的,其中有三个是与资源复用有关,分别是<viewStub/>, <requestFocus />, ...

  4. CSS常用函数calc等

    >>CSS常用函数<<

  5. hdu 1050 Moving Tables (Greedy)

    Problem - 1050 过两天要给12的讲贪心,于是就做一下水贪心练习练习. 代码如下: #include <cstdio> #include <iostream> #i ...

  6. H3C 路由器单播IP包转发

  7. HDU 1026 BSF+优先队列+记录路径、

    #include<iostream> #include<cmath> #include<cstring> #include<cstdio> #inclu ...

  8. codeforces 1230 div2

    C 给一个图,并且在边上放上多米诺骨牌,使得每个多米诺骨牌指向的顶点的数字是一致的,并且每种骨牌只能用一种.问最多能够覆盖多少条边. 先生成每一个点指向的数字,然后判断就好了. #include< ...

  9. 在eclipse中建立lua开发环境

    1. 给你的eclipse安装LuaEclipse,新增Eclipse Software Update Site“http://luaeclipse.luaforge.net/update-site ...

  10. python单例模式的实现与优化

    python单例模式的实现与优化 阅读目录(Content) 单例模式 实现单例模式的几种方式 1.使用模块 2.使用装饰器 3.使用类 4.基于__new__方法实现(推荐使用,方便) 5.基于me ...