UVa1347/poj2677 - C - Tour(DP)

UVa1347/poj2677 - C - Tour

题意:有n个点,一飞行员从1号点出发,严格从左走到右在返回1号点(同样严格从右走到左),求经过除1号点和n号点外每个点恰好一次的整个行程的最小值。

 

分析:与货郎担问题很相似,只是这里是先到n号点在返回走完未走的点,很多博主称之为双调欧几里得旅行商问题,紫书上面也说这是个经典问题,这题确实值得一做。

刚开始顺理成章地状态压缩dp了一次,因为必须要知道哪些点已经过才行,也顺利的过了样例,交上去RE…..题目的点数没给定范围,所以刚开始根本不知道,后面知道点很多之后,就再也不知道怎么进行DP了….无奈只能看紫书上的分析,解法真是奇妙!!!

首先是一个转换问题,既然人从n号点返回是走完之前未走的点,那么等价转换为两个人同时从1号点出发,总共不重复地走完中间的n-2个点,最后到达n号点,求整个过程的最短距离,那么定义dp[i][j]为第一个人走到i号点,第2个人走到j号点时整个过程的最短行程,因为不知道第一个人走到i号点,第2个人走到j号点时之前的点是否都走过,那么便重新定义dp[i][j](假定这里i>j)为两个人走完1到i号点中所有点的最短行程。dp[i][j]等于dp[j][i],因为是对称的,将两个人交换就可以了,那么决策呢?我们可能会想每个人都可以走i+1后的这些点,但是这样是不符合状态的定义的,因为没有保证每个点都走过,在这样定义的状态中,每个状态转移时不应该存在这样的决策的,要保证每个点都走过的话,那么对于一个新的点i+1,要么第一个人走

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值