“刷表法”动态规划

                                                             Mobile Service
                                               (service.pas/c/cpp;时限3s;256M)

描述:
      一个公司有三个移动服务员。如果某个地方有一个请求,某个员工必须赶到那个地方去(那个地方没有其他员工),某一时刻只有一个员工能移动。被请求后,他才能移动,不允许在同样的位置出现两个员工。从p到q移动一个员工,需要花费c(p,q)。这个函数没有必要对称,但是c(p,p)=0。公司必须满足所有的请求。目标是最小化公司花费。
输入格式:
  第一行有两个整数L,N(3<=L<=200, 1<=N<=1000)。L是位置数 ;N是请求数。每个位置从1到L编号。下L行每行包含L个非负整数。第i+1行的第j个数表示c(i,j) ,并且它小于2000。最后一行包含N个数,是请求列表。一开始三个服务员分别在位置1,2,3。
输出格式:
  一个数M,表示最小服务花费。
输入输出样例:
service.in
5 9
0 1 1 1 1
1 0 2 3 2
1 1 0 4 1
2 1 5 0 1
4 2 3 4 0
4 2 4 1 5 4 3 2 1
service.out
5

 

              不听话机器人

(时限:1 sec | 内存: 128 MB)

 

描述

X由于太强,不屑于参加NOIP,但是为了保送还要拿奖。于是他买了一个不太听话的机器人,这个机器人总是会有自己的想法,而不会完全遵守X给它的指令。

现在X在试图命令机器人走到考场。路上是一个 N*N 个格子组成的区域,格子自左上角到右下角从 (1,1) 到 (N,N) 编号。第 i 行、第 j 列的格子编号为 (i,j)。某些区域是障碍物,机器人不能移动到那里。

神牛给了机器人 M 条指令,指令的类型包括“前进一步”“后退一步”“左转九十度”“右转九十度”。但问题是机器人并不能完全遵守这些指令,因为如果机器人完全遵守这些指令,它可能会走到障碍物的格子里或者走到迷宫外面去,那样就会有危险。机器人希望从这个指令序列里面去掉一些,然后执行剩下的指令时,可以保证整个过程中都不会有危险。

机器人虽然不太听话,但它并不想惹恼了X,否则X可能会把它拆掉的。所以机器人希望去掉的指令尽量少。

那么,机器人最少需要去掉多少条指令才能保证不会有危险呢?

输入格式(Z.in)

  第一行有四个整数 N、M、X0、Y0。表示迷宫的大小是 N*N,指令共有 M 条,机器人初始时的位置是 (X0,Y0)。机器人初始时面朝的方向是上方。也就是说,若机器人按照初始时的方向走,效果是所在的 X 坐标越来越小。

下面有 N 行,每行有 N 个字符,可能是点号 '.' 或星号 '*'。'.' 表示空地,'*' 表示障碍。初始位置肯定是一个空地。

下面的 M 行,每行有一个字符串,表示指令。字符串可能是:FORWARD(前进一步)、BACK(后退一步)、LEFT(左转)、RIGHT(右转)。

输出格式(Z.out)

  只需要输出一个整数,表示机器人最少需要去掉多少条指令才能保证不出危险。

样例输入

4 7 3 3

.***

..**

*..*

****

LEFT

FORWARD

LEFT

BACK

FORWARD

RIGHT

FORWARD

样例输出

1

样例说明

去掉第 3 条、第 5 条或者第 7 条指令都可以保证机器人无危险。

数据范围

迷宫的边长 N<=100。

指令数 M<=1000。

 

 

  这两题都用动态规划。

 

转载于:https://www.cnblogs.com/noanti/archive/2011/10/10/2205387.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值