Connect(bzoj 1948)
2024-09-04 06:57:47
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 ;
}
最新文章
- RHEL6.4 + Oracle 11g DG测试环境快速搭建参考
- 攻城狮在路上(陆)-- 提交运行MapReduce程序到hadoop集群运行
- MVC之前的那点事儿系列(5):Http Pipeline详细分析(下)
- rhel7端口开放和查询
- MySql错误1045 Access denied for user &#39;root&#39;@&#39;localhost&#39; (using password:YES) windows下的解决方案(忘记密码)
- iOS Build Setting证书设置
- [C和指针]第二部分
- 给宏基装WIN8.1系统之问题与解决方法(原创)
- 去除下载电影和电视剧文件名中的多余字符[python实现]
- 编写一个Shape类,具有属性:周长和面积; 定义其子类三角形和矩形,分别具有求周长的方法。 定义主类E,在其main方法中创建三角形和矩形类的对象, 并赋给Shape类的对象a、b,使用对象a、b来测试其特性。
- mysql myisam 锁表问题<;转>;
- 随机抽样一致算法(Random sample consensus,RANSAC)
- poj 1948 Triangular Pastures 小结
- OpenCV 之 网络摄像头
- IdentityServer Topics(2)- 定义资源
- CodeChef Cards, bags and coins [DP 泛型背包]
- Spring 环境与profile(三)——利用maven的resources、filter和profile实现不同环境使用不同配置文件
- NOI2017总结
- 力扣(LeetCode)191. 位1的个数
- 问题描述: fatal error: &#39;XCTest/XCTest.h&#39; file not found
热门文章
- SpringBoot学习1:创建第一个SpringBoot项目
- 【前端_js】前端跨网络异步获取资源——fetch()
- ASP.NET Core模块化前后端分离快速开发框架介绍之1、开篇
- c#用object将datatable快速填充excel后下载表格后打不开的问题
- kuangbin 并查集
- [BZOJ3684][拉格朗日反演+多项式求幂]大朋友和多叉树
- SQLite学习和使用
- Aizu 2560 Point Distance FFT
- cf979d Kuro and GCD and XOR and SUM
- VC下如何调用控制台命令以及其他可执行文件