Description

给定一个R*C大小的迷宫,其中R,C均为奇数 迷宫中坐标为两个奇数的点不能通过,称为障碍,迷宫中其他不能通过的点统称为墙壁 坐标为两个偶数的点可以通过,称为房间,迷宫中其他可通过的点称为走廊。迷宫有边界 迷宫中放置有若干个物品(偶数个),物品一定放置在房间中 问如何将这些物品配对可以使得所有物品对之间路径的总和最小,任两条路径不能相交,并求路径

Input

第一行输入为两个整数: R与C(5 ≤ R ≤ 25,5 ≤ C ≤ 80) 其中R为行数,C为列数,R,C均为奇数。 接下来的R行每行包括C个字符,每个字符都是’+’、’|’、’-‘、空格或’X’中的一个,分别表示障碍及两种墙壁、空格表示房间或可通过的走廊,X表示房间中的物品。

Output

输出的第一行是一个整数,即最小分值。
/*
插头DP
这道题看了一晚上了,还是有很多地方不理解,Orz~
*/
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
int n,m,inf,cnt;
int f[][][(<<)+],blo[][][];
char s1[][],s[][];
int dx[]={,-,,};
int dy[]={-,,,};
void upd(int &x,int y){x=min(x,y);}
int trs(int x,int y){
x=(x>>)<<;x|=y&;
x|=((y&)>>)<<m;
return x;
}
int main(){
scanf("%d%d",&n,&m);gets(s1[]+);
for(int i=;i<=n;i++) gets(s1[i]+);
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
s[j][i]=s1[i][j],cnt+=(s1[i][j]=='X');
swap(n,m);
for(int i=;i<n;i+=)
for(int j=;j<m;j+=)
for(int k=;k<;k++)
blo[i>>][j>>][k]=(s[i+dy[k]][j+dx[k]]!=' ');
n/=;m/=;
memset(f[],0x3f,sizeof(f[]));
inf=f[][][];f[][][]=;
for(int i=;i<=n;i++)
for(int j=;j<=m;j++){
if(j==m)
memset(f[~i&],0x3f,sizeof(f[~i&]));
for(int k=;k<<<m+;k++){
if(f[i&][j][k]==inf) continue;
int *nex;
if(j==m) nex=f[~i&][];
else nex=f[i&][j+];
int v1=blo[i][j][],v2=blo[i][j][],val=f[i&][j][k];
if(s[i<<][j<<]=='X'){
if((k&)==) continue;
if((k&)==){
if(!v2) upd(nex[trs(k,)],val+);
if(!v1) upd(nex[trs(k,)],val+);
}
else upd(nex[trs(k,)],val);
}
else{
if((k&)==) upd(nex[trs(k,)],val+);
else if((k&)==){
upd(nex[trs(k,)],val);
if(!v1&&!v2) upd(nex[trs(k,)],val+);
}
else {
if(!v2) upd(nex[trs(k,)],val+);
if(!v1) upd(nex[trs(k,)],val+);
}
}
}
}
printf("%d\n",f[(n+)&][][]+cnt/);
return ;
}

Connect(bzoj 1948)的更多相关文章

  1. BZOJ 1614 USACO 07Jan. 洛谷1948 电话线

    二分+特殊姿势的check:二分最小代价P,把边权小于等于P的边设为0,其他的设为1,跑一遍最短路,判断dis[n]是否大于K #include<cstdio> #include<a ...

  2. 【BZOJ】【2049】【SDOI2008】洞穴勘测 Cave

    LCT 哦……LCT的一道更水的裸题,适合学习access,link,cut等基本操作(其实这三个不是在一个层面上的?不要在意这些细节……) /**************************** ...

  3. BZOJ 2002 && BZOJ 2409 LCT && BZOJ 3282 初步练习

    #include <cstdio> ; inline void Get_Int(int & x) { ; ') ch=getchar(); +ch-'; ch=getchar(); ...

  4. 【BZOJ】2049: [Sdoi2008]Cave 洞穴勘测(lct/并查集)

    http://www.lydsy.com/JudgeOnline/problem.php?id=2049 bzoj挂了..在wikioi提交,,1A-写lct的速度越来越快了-都不用debug-- 新 ...

  5. 【BZOJ】【4034】【HAOI2015】T2

    树链剖分/dfs序 树上单点修改+子树修改+链查询 其实用dfs序做也可以…… 其实树链剖分就是一个特殊的dfs序嘛= =所以树链剖分也可以搞子树-(Orz ZYF) 至于为什么……你看在做剖分的时候 ...

  6. 【BZOJ】【1036】树的统计

    嗯这题是一道对树进行动态修改&查询的经典题目,可以拿来练习树链剖分~ 啊对于这种动态修改&查询的题目,我们最喜闻乐见的就是在一个序列上去做了,毕竟可以直接套各种数据结构模版啊,比如线段 ...

  7. 【BZOJ】【2588】COT(Count On a Tree)

    可持久化线段树 maya……树么……转化成序列……所以就写了个树链剖分……然后每个点保存的是从它到根的可持久化线段树. 然后就像序列一样查询……注意是多个左端点和多个右端点,处理方法类似BZOJ 19 ...

  8. 【BZOJ】【2819】NIM

    这题……咋说捏,其实是一道披着博弈论外衣的树上操作问题…… 随便用dfs序或者树链剖分转成序列,然后查询路径上的所有点的NIM和(异或和)就行了,毕竟除了是在树上以外,就是裸的NIM问题. 树链剖分: ...

  9. BZOJ 3563 DZY Loves Chinese

    Description 神校XJ之学霸兮,Dzy皇考曰JC. 摄提贞于孟陬兮,惟庚寅Dzy以降. 纷Dzy既有此内美兮,又重之以修能. 遂降临于OI界,欲以神力而凌♂辱众生. 今Dzy有一魞歄图,其上 ...

随机推荐

  1. Android驱动开发读书笔记七

    第七章 (一)创建设备文件 1.使用cdev_init函数初始化cdec 描述设备文件需要一个cdev结构体,代码如下: struct cdev{ struct kobject kobj; struc ...

  2. ATM-db-dnhandler

    import os,jsonfrom conf import settings def select(name): user_path = os.path.join(settings.BASE_DB, ...

  3. JZOJ 4307. 喝喝喝

    Description

  4. Python中关于集合的介绍及用法

    一.集合的含义及创建方法 集合(set)是一种无序的并且里面存放不同元素的序列. 集合可以使用大括号 { } 或者 set() 函数创建集合,注意:创建一个空集合必须用 set() 而不是 { },因 ...

  5. Falsk

    flask: 1.配置文件的几种方式: 1.app.config['DEBUG'] =True 2.app.config.from_pyfile("setting.py") 3.a ...

  6. Azure Active Directory Connect是如何协助管理员工作的?

    TechTarget中国原创] 应用基于云的Microsoft Azure Active Directory,管理员们可以将本地Active Directory整合到Windows Server中.通 ...

  7. NOS直传加速服务

    本文来自网易云社区 作者:孙建良 最近团队在对存储系统做一些性能测试,期间遇到了不少问题,测试过程中得出的结果也没有很好的数据支撑,所以尝试了非常多的方法来对性能问题进行定位. 小王童鞋是挺厉害的,使 ...

  8. IOS开发学习笔记024-UIButton和UIImageView的区别

    一.UIButton和UIImageView的区别 1. UIImageView 默认只能显示一张图片(默认会填充整个ImageView) 设置方法:image/setImage: UIButton ...

  9. centOS如何设置时间同步

     1.进入系统-管理-时间和日期  2.这个需要root权限才能进行设置,在弹出框中填入root密码  3.设置时间和日期-勾选同步,并且选择NTP时间服务器,点击确定 4.选择时区为亚洲上海点击保存 ...

  10. APP网络测试点