http://poj.org/problem?id=3133 (题目链接)

题意

  $n*m$的网格里有空格和障碍,还有两个$2$和两个$3$。要求把这两个$2$和两个$3$各用一条折线连起来。障碍里不能有线,而每个空格里最多只能有一条线,也就是说两条折线不能相交,每条折线不能自交。问两条折线的总长度最短是多少。

Solution

  插头dp。

  类似于插头记录连通情况,我们这里的插头记录的是它属于那条折线。折线只有两条,所以插头的种类就三种:0(无插头),2(插头所在的直线是$2$所延伸出的直线),3(插头所在的直线是$3$所延伸出的直线)。所以我们用四进制记录状态,解码的时候也不需要求解最小表示法了。$f[i][j][k]$表示到了格子$(i,j)$,状态$k$的折线最短长度。前面两维滚动一下。

  转移分三种情况:格子为障碍,格子为空格,格子为$2$或$3$。如果跟hash中的重复了就取个min好了。别的都跟那道板子题差不多。

细节

  注意清空hash表。

代码

// poj3133
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<queue>
#define LL long long
#define MOD 4001
#define inf 2147483640
#define Pi acos(-1.0)
#define free(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
using namespace std; const int maxd=15,maxs=100010,maxh=4010;
int n,m,code[maxd],a[maxd][maxd];
int next[maxs],head[maxh];
int size[2],dis[2][maxs],s[2][maxs]; void decode(int st) {
for (int i=m;i>=0;i--) code[i]=st&3,st>>=2;
}
int encode() {
int st=0;
for (int i=0;i<=m;i++) st=st<<2|code[i];
return st;
}
void add(int p,int d) {
int tmp=encode(),id=tmp%MOD;
for (int i=head[id];i;i=next[i])
if (s[p][i]==tmp) {dis[p][i]=min(dis[p][i],d);return;}
dis[p][++size[p]]=d;s[p][size[p]]=tmp;
next[size[p]]=head[id];head[id]=size[p];
}
void shift() {
for (int i=m;i;i--) code[i]=code[i-1];code[0]=0;
}
int main() {
while (scanf("%d%d",&n,&m)!=EOF && n && m) {
memset(a,0,sizeof(a));
for (int i=1;i<=n;i++)
for (int j=1;j<=m;j++) {
scanf("%d",&a[i][j]);
if (a[i][j]==0 || a[i][j]==1) a[i][j]^=1;
}
int p=0;
size[p]=1;dis[p][1]=0;s[p][1]=0;
for (int i=1;i<=n;i++)
for (int j=1;j<=m;j++) {
size[p^=1]=0;
memset(head,0,sizeof(head));
for (int k=1;k<=size[p^1];k++) {
decode(s[p^1][k]);
int left=code[j-1],up=code[j];
if (a[i][j]==0) {
code[j-1]=code[j]=0;
if (j==m) shift();
add(p,dis[p^1][k]);
}
else if (a[i][j]==1) {
if (left && up) {
if (left==up) {
code[j-1]=code[j]=0;
if (j==m) shift();
add(p,dis[p^1][k]+1);
}
}
else if (left || up) {
int tmp=left ? left : up;
if (a[i][j+1]) {
code[j-1]=0,code[j]=tmp;
add(p,dis[p^1][k]+1);
}
if (a[i+1][j]) {
code[j-1]=tmp,code[j]=0;
if (j==m) shift();
add(p,dis[p^1][k]+1);
}
}
else {
if (a[i+1][j] && a[i][j+1]) {
code[j-1]=code[j]=2;
add(p,dis[p^1][k]+1);
code[j-1]=code[j]=3;
add(p,dis[p^1][k]+1);
}
code[j-1]=code[j]=0;
if (j==m) shift();
add(p,dis[p^1][k]);
}
}
else if (a[i][j]==2 || a[i][j]==3) {
if ((left && !up) || (up && !left)) {
int tmp=left ? left : up;
if (tmp==a[i][j]) {
code[j-1]=code[j]=0;
if (j==m) shift();
add(p,dis[p^1][k]);
}
}
else if (!left && !up) {
if (a[i][j+1]) {
code[j-1]=0,code[j]=a[i][j];
add(p,dis[p^1][k]);
}
if (a[i+1][j]) {
code[j-1]=a[i][j],code[j]=0;
if (j==m) shift();
add(p,dis[p^1][k]);
}
}
}
}
}
int ans=inf;
for (int i=1;i<=size[p];i++) ans=min(ans,dis[p][i]);
printf("%d\n",ans==inf ? 0 : ans+2);
}
return 0;
}

【poj3133】 Manhattan Wiring的更多相关文章

  1. 【u250】manhattan

    Time Limit: 1 second Memory Limit: 64 MB [问题描述] 混乱的城市已经变得无法控制.大楼随处乱造,城市的布局也是一片混乱.市长决定要结束这种局面,兵器并且想建造 ...

  2. poj3133 Manhattan Wiring

    Manhattan Wiring Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 2016   Accepted: 1162 ...

  3. 【转】ACM训练计划

    [转] POJ推荐50题以及ACM训练方案 -- : 转载自 wade_wang 最终编辑 000lzl POJ 推荐50题 第一类 动态规划(至少6题, 和 必做) 和 (可贪心) (稍难) 第二类 ...

  4. hihoCoder 1392 War Chess 【模拟】 (ACM-ICPC国际大学生程序设计竞赛北京赛区(2016)网络赛)

    #1392 : War Chess 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 Rainbow loves to play kinds of War Chess gam ...

  5. 【数据挖掘】分类之kNN(转载)

    [数据挖掘]分类之kNN 1.算法简介 kNN的思想很简单:计算待分类的数据点与训练集所有样本点,取距离最近的k个样本:统计这k个样本的类别数量:根据多数表决方案,取数量最多的那一类作为待测样本的类别 ...

  6. 【转】R语言函数总结

    原博: R语言与数据挖掘:公式:数据:方法 R语言特征 对大小写敏感 通常,数字,字母,. 和 _都是允许的(在一些国家还包括重音字母).不过,一个命名必须以 . 或者字母开头,并且如果以 . 开头, ...

  7. 【LeetCode】1162. 地图分析 As Far from Land as Possible(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 这个题想考察什么? 剩下的任务就是套模板! 日期 题目 ...

  8. Python高手之路【六】python基础之字符串格式化

    Python的字符串格式化有两种方式: 百分号方式.format方式 百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存.[PEP-3101] This ...

  9. 【原】谈谈对Objective-C中代理模式的误解

    [原]谈谈对Objective-C中代理模式的误解 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 这篇文章主要是对代理模式和委托模式进行了对比,个人认为Objective ...

随机推荐

  1. Tensorflow张量的形状表示方法

    对输入或输出而言: 一个张量的形状为a x b x c x d,实际写出这个张量时: 最外层括号[…]表示这个是一个张量,无别的意义! 次外层括号有a个,表示这个张量里有a个样本 再往内的括号有b个, ...

  2. maven scope属性值设置含义

    1.枚举各个属性值的含义 compile,缺省值,适用于所有阶段,会打包进项目. provided,类似compile,期望JDK.容器或使用者会提供这个依赖. runtime,只在运行时使用,如JD ...

  3. windows下在idea用maven导入spark2.3.1源码并编译并运行示例

    一.前提 1.配置好maven:intellij idea maven配置及maven项目创建 2.下载好spark源码: 二.导入源码: 1.将下载的源码包spark-2.3.1.tgz解压(E:\ ...

  4. Hadoop源码阅读环境搭建(IDEA)

    拿到一份Hadoop源码之后,经常关注的两件事情就是 1.怎么阅读?涉及IDEA和Eclipse工程搭建.IDEA搭建,选择源码,逐步导入即可:Eclipse可以选择后台生成工程,也可以选择IDE导入 ...

  5. 开源ETL工具kettle系列之常见问题

    开源ETL工具kettle系列之常见问题 摘要:本文主要介绍使用kettle设计一些ETL任务时一些常见问题,这些问题大部分都不在官方FAQ上,你可以在kettle的论坛上找到一些问题的答案 1. J ...

  6. FirstWebApp

    servlet规范中定义了web应用程序的目录层次:http://localhost:8080/docs/appdev/deployment.html 第一个web应用程序 开发,并部署到tomcat ...

  7. ROS (Robot Operating System) 相关资料与文档

    本博文持续更新…… ROS学习与实践保护很多资料,最权威的当然是官网: www.ros.org 当然也有很多其他博文,尤其是中文文档有助于理解.2017推出一篇新博文,概况的资料较全. http:// ...

  8. 满帮集团CEO:未来将向“智慧型”公司转变,要成为一家生态公司

    谁都想成为下一个滴滴.显然,王刚也希望在物流业,货车帮与运满满在合并后,能够企及滴滴的高度. 货车帮与运满满,都曾是货运物流领域的翘楚,也因为业务的竞争关系有过水火不容厮杀.但最终还是在资本与地方政府 ...

  9. 解决iscroll.js上拉下拉刷新手指划出屏幕页面无法回弹问题

    博客已迁移至http://zlwis.me. 使用过iscroll.js的上拉下拉刷新效果的朋友应该都碰到过这个问题:在iOS的浏览器中,上拉或下拉刷新时,当手指划出屏幕后,页面无法弹回.很多人因为解 ...

  10. Bing词典vs有道词典比对测试报告——功能篇之辅助功能,差异化功能及软件的效能

    1.辅助功能: 和有道相比,必应的词典加入了换肤功能,用户可以选择喜欢的颜色,而且必应的皮肤也比较多,这一点设计给必应增色不少. 相对而言,有道则加入了调节客户端字体的大小,如下,也比较人性化 2.差 ...