题目名称 1530. [UVa 1501] 修建长城
输入输出 constructthegreatwall.in/out
难度等级 ★★★★
时间限制 1000 ms (1 s)
内存限制 256 MiB
测试数据 10
题目来源 Gravatarcstdio 于2014-02-23加入
开放分组 全部用户
提交状态
分类标签
UVa 动态规划 状态压缩
分享题解
通过:2, 提交:2, 通过率:100%
Gravatarcstdio 100 0.125 s 0.41 MiB C++
Gravatarcstdio 100 0.321 s 7.18 MiB C++
关于 修建长城 的近10条评论(全部评论)
需要仔细考虑转移……
达成成就:《训练指南》轮廓线DP……真淡腾……
Gravatarcstdio
2014-02-23 22:17 1楼

1530. [UVa 1501] 修建长城

★★★★   输入文件:constructthegreatwall.in   输出文件:constructthegreatwall.out   简单对比
时间限制:1 s   内存限制:256 MiB

【题目描述】

防御墙是一种保护城市或定居点免遭潜在侵略者袭击的工事。从古至今,人们都在定居点周围修建这些墙。

通常,它们被称为城墙。虽然这样,我们的祖先决定修建长城来保护中原免遭各种游牧部落的入侵。

地图是一个给定的N*M矩形区域。每一个格子是一块空地,一座城市或者一支敌军。长城是一个边沿着格线的简单多边形,围住了所有的城市,将所有的敌军挡在外面。

长城并不容易建造,因此我们必须让长城尽可能短。现在你的任务是计算围住所有城市但不围住任意一支敌军的长城的最短长度。

【输入格式】

输入文件的第一行是一个整数T(1<=T<=50),代表数据组数。

每组数据有若干行。

数据的第一行有两个正整数H,W(1<=H,W<=8),代表地图的行数和列数。

接下来H行每行有W个字符,代表相应的格子。'o'代表城市,'.'代表空地,'x'代表敌军。

保证至少有一座城市。

【输出格式】

对每组数据,输出一行"Case #X: Y",其中X是数据编号(从1开始),Y是长城的最短长度(如果无法建造,输出-1)。

【样例输入】

3

3 3

.o.

.x.

o.o

4 4

....

.ox.

.xo.

....

5 5

.ooo.

.x...

..xoo

x.xoo

.ox.x

【样例输出】

Case #1: 14

Case #2: -1

Case #3: 28

【提示】

一个简单多边形是平面上一系列线段围成的封闭区域,这些线段之间除了相邻边之外没有公共点。

样例的第一组数据的解见图1.

样例的第二组数据没有解,因为无论如何修建长城,它的非相邻边总会相交。

【来源】

UVa1501 Construct the Great Wall