Problem Mountain

题目大意

  给定一张n*m的地图,由 . 和 X 组成。要求给每个点一个1~n*m的数字(每个点不同),使得编号为X的点小于其周围的点,编号为.的点至少大于一个其周围的点。

    n<=5 , m<=5。

解题分析

  考虑从1~n*m,从小到大依次填数,则如果某个位置编号为X且该位置还未填数,那么其周围的点均不能填数。

  令dp[i][j]表示填到第i个数,状态为j 。 令X的个数为cnt,那么 j ∈[ 0 , 1<<cnt)。

  一种情况为第i个数填在 X 的位置上,那么dp[i][j] 可以由 dp[i-1][j-{x}] 转移过来。 j - {x} 表示去掉某个X后的状态。

  另一种情况为第i个数填在 . 的位置,那么首先预处理一下w[j]表示状态为j时有多少个位置是可以填的,那么dp[i]][j] += dp[i-1][j] * (w[j] - (i-1))

  又因为要保证遍号为.的点至少大于一个其周围的点,dfs容斥一下。

参考程序

 #include <map>
#include <set>
#include <stack>
#include <queue>
#include <cmath>
#include <ctime>
#include <string>
#include <vector>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cassert>
#include <iostream>
#include <algorithm>
#pragma comment(linker,"/STACK:102400000,102400000")
using namespace std; #define N 100008
#define M 50008
#define LL long long
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define clr(x,v) memset(x,v,sizeof(x));
#define rep(x,y,z) for (int x=y;x<=z;x++)
#define repd(x,y,z) for (int x=y;x>=z;x--)
const int mo = ;
const int inf = 0x3f3f3f3f;
const int INF = ;
/**************************************************************************/
int n,m,ans,dp[][],w[],tx[],ty[];
char mp[][];
int flag[][];
const int dx[]={-,-,-,,,,,,};
const int dy[]={-,,,-,,,-,,};
void up(int &x,int y){
x = (x + y) % mo;
if (x>=mo) x-=mo;
}
int solve(){
int cnt=;
rep(i,,n) rep(j,,m)
if (mp[i][j]=='X'){
tx[++cnt]=i;
ty[cnt]=j;
}
for (int i=;i<<<cnt;i++){
clr(flag,);
for (int j=;j<=cnt;j++)
if (i & <<j-)
for (int k=;k<;k++) flag[tx[j]+dx[k]][ty[j]+dy[k]]=;
w[i]=;
rep(j,,n) rep(k,,m)
if (!flag[j][k]) w[i]++;
}
clr(dp,);
dp[][]=;
for (int i=;i<=n*m;i++)
for (int j=;j<<<cnt;j++)
{
for (int k=;k<=cnt;k++)
if (j & <<k-)
up(dp[i][j],dp[i-][j - (<<k-)]);
up(dp[i][j],dp[i-][j]*(w[j]-i+));
}
return dp[n*m][(<<cnt)-];
}
void dfs(int x,int y,int p){
if (y==m+){
x++;
y=;
}
if (x==n+){
ans=(ans + solve()*p) % mo;
if (ans<) ans+=mo;
return;
}
int flag=;
for (int i=;i<;i++) if (i!=&&mp[x+dx[i]][y+dy[i]]=='X') flag=;
if (mp[x][y]=='X')
if (flag) return; else dfs(x,y+,p);
else
{
dfs(x,y+,p);
if (!flag)
{
mp[x][y]='X';
dfs(x,y+,-p);
mp[x][y]='.';
}
}
}
int main(){
int cas=;
while (~scanf("%d %d",&n,&m)){
clr(mp,); ans=;
rep(i,,n) scanf("%s",mp[i]+);
dfs(,,);
printf("Case #%d: %d\n",++cas,ans);
}
}

HDU 5838 (状压DP+容斥)的更多相关文章

  1. codeforces 342D Xenia and Dominoes(状压dp+容斥)

    转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud D. Xenia and Dominoes Xenia likes puzzles ...

  2. bzoj2669 [cqoi2012]局部极小值 状压DP+容斥

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=2669 题解 可以发现一个 \(4\times 7\) 的矩阵中,有局部最小值的点最多有 \(2 ...

  3. 一本通 1783 矩阵填数 状压dp 容斥 计数

    LINK:矩阵填数 刚看到题目的时候感觉是无从下手的. 可以看到有n<=2的点 两个矩形. 如果只有一个矩形 矩形外的方案数容易计算考虑 矩形内的 必须要存在x这个最大值 且所有值<=x. ...

  4. P3160 [CQOI2012]局部极小值 题解(状压DP+容斥)

    题目链接 P3160 [CQOI2012]局部极小值 双倍经验,双倍快乐 解题思路 存下来每个坑(极小值点)的位置,以这个序号进行状态压缩. 显然,\(4*7\)的数据范围让极小值点在8个以内(以下示 ...

  5. [清华集训2015 Day1]主旋律-[状压dp+容斥]

    Description Solution f[i]表示状态i所代表的点构成的强连通图方案数. g[i]表示状态i所代表的的点形成奇数个强连通图的方案数-偶数个强连通图的方案数. g是用来容斥的. 先用 ...

  6. NOIp模拟赛 巨神兵(状压DP 容斥)

    \(Description\) 给定\(n\)个点\(m\)条边的有向图,求有多少个边集的子集,构成的图没有环. \(n\leq17\). \(Solution\) 问题也等价于,用不同的边集构造DA ...

  7. uoj#37. 【清华集训2014】主旋律(状压dp+容斥)

    传送门 第一眼容斥,然后我就死活容不出来了-- 记\(f_i\)为点集\(i\)中的点强联通的方案数,那么就是总的方案数减去使\(i\)不连通的方案数 如果\(i\)不连通的话,我们可以枚举缩点之后拓 ...

  8. BZOJ 3812 主旋律 (状压DP+容斥) + NOIP模拟赛 巨神兵(obelisk)(状压DP)

    这道题跟另一道题很像,先看看那道题吧 巨神兵(obelisk) 题面 欧贝利斯克的巨神兵很喜欢有向图,有一天他找到了一张nnn个点mmm条边的有向图.欧贝利斯克认为一个没有环的有向图是优美的,请问这张 ...

  9. bzoj2560串珠子 状压dp+容斥(?)

    2560: 串珠子 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 515  Solved: 348[Submit][Status][Discuss] ...

随机推荐

  1. apache 一域名下多个二级域名如何做设置?

    域名最新配置说明官网:http://apache.chinahtml.com/ 目的是在根目录,不同子域名可以访问不同目录下的网站: 第一步:打开 C:\Windows\System32\driver ...

  2. [LeetCode_1] twoSum

    LeetCode: 1. twoSum 题目描述 Given an array of integers, return indices of the two numbers such that the ...

  3. centos6.6编译安装lnmp系列之mysql

    简介: 环境:虚拟机+centos6.6 Mysql版本:5.6.21 Mysql下载地址:http://cdn.mysql.com/archives/mysql-5.6/mysql-5.6.21.t ...

  4. didFinishLaunchingWithOptions

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launc ...

  5. 。【自学总结 3】------3ds Max 主工具栏

    1.选择并链接:选择对象,使其和其他对象建立父子关系. 2.断开选择链接:撤销链接关系. 3.选择过滤器列表:可以限制要选择的对象的特定类型和组合.例如,我们选择几何体后,其他对象就无法被选择. 4. ...

  6. pycharm上运行django服务器端、ip地址访问

    安装Django  下载Django包,解压缩. CMD 进入解压路径下. 执行:python setup.py install 增加环境变量: C:\Python27\Scripts 测试djang ...

  7. Key Figure、Exception Aggreagion、Non-Cumulative KeyFigure

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  8. mysql5.x(<7) sql文件导入到5.7

    一.修改sql—model http://www.linuxidc.com/Linux/2016-09/135372.htm

  9. IndexOutOfBoundsException ArrayList 访问越界

    java.lang.IndexOutOfBoundsException: Index: 3, Size: 2

  10. 字符串去空格 java , js和Jquery 方法

    1.  java方式 String.trim(); 2.js方式 function Trim(str) { return str.replace(/(^\s*)|(\s*$)/g, "&qu ...