Chapter_9 DP : uva1347 tour (bitonic tour)
https://cn.vjudge.net/problem/UVA-1347
这道题居然可以O(n^2)解决, 让我太吃惊了!!!
鄙人见识浅薄, 这其实是一个经典问题: bitonic tour.
它的定义是:
从最左点走到最右点在走回来, 不重复经过点, 最小需要多少路程.
在最左点走到最右点的过程中, 只走到比当前点x坐标大的点, 反之同理. (在该题中, 没有两个点x坐标重复)
要得出\(O(n^2)\)的DP算法, 需要几步转化:
首先, 计算从左到右再回来的路径长度很麻烦(因为这样回来时要标记所有走过的点, 状态\(2^n\)), 不可行.
可以看成有两个人从最左点出发, 经过不同的路径, 最后都走到了最右点.
然后, 为了防止集合的标记, 我们定义以下状态:
不妨设i>j.(请思考)
\]
这样我们就无需标记经过的点了.
因为每次每个人都在向右走, 所以只要讨论一下是那个人走到了\(i+1\)就可以了.
这就是状态转移方程:
f[i+1][i] = min(f[i+1][i], f[i][j] + dist(j, i+1));
f[i+1][j] = min(f[i+1][j], f[i][j] + dist(i, i+1));
其实, "向右走" 就是一个天然的"序". 这就可以让该dp满足"无后效性"原则
这也就是TSP不能用这种方法的原因.
为何我们不会漏掉可能的情况?
思考一下, 是不是每一条走完{1..n}的路线都存在一个走完{1..i}(i<n)的子路线? 所以不会漏.
code
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define rep(_i, _st, _ed) for(int _i = (_st); _i <= (_ed); ++_i)
#define per(_i, _ed, _st) for(int _i = (_ed); _i >= (_st); --_i)
inline int read(){int ans = 0, f = 1; char c = getchar();while(c < '0' || c > '9') f = (c == '-') ? -1 : f, c = getchar();while('0' <= c && c <= '9') ans = ans*10 + c - '0', c = getchar();return ans;}
const int maxn = 1005;
double f[maxn][maxn];
struct poi{
double x, y;
bool operator < (const poi &rhs) const{
return x < rhs.x;
}
}p[maxn];
int n;
#define sqr(_x) ((_x)*(_x))
double dist(int a, int b){
return sqrt(sqr(p[a].x-p[b].x) + sqr(p[a].y - p[b].y));
}
signed main(){
while(cin >> n) {
rep(i, 1, n) cin >> p[i].x >> p[i].y;
if(n == 1) {
puts("0.00");
continue;
}
sort(p+1, p+n+1);
rep(i, 1, n) rep(j, 1, n) f[i][j] = 1e10;
//i > j
f[2][1] = dist(1, 2);
rep(i, 2, n) rep(j, 1, i-1){
f[i+1][i] = min(f[i+1][i], f[i][j] + dist(j, i+1));
f[i+1][j] = min(f[i+1][j], f[i][j] + dist(i, i+1));
}
printf("%.2f\n", f[n][n-1] + dist(n, n-1));
}
return 0;
}
Chapter_9 DP : uva1347 tour (bitonic tour)的更多相关文章
- POJ2677 Tour[DP 状态规定]
Tour Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 4307 Accepted: 1894 Description ...
- POJ2677 Tour(DP+双调欧几里得旅行商问题)
Tour Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 3929 Accepted: 1761 Description ...
- F - Free DIY Tour(动态规划,搜索也行)
这道题可用动态规划也可以用搜索,下面都写一下 Description Weiwei is a software engineer of ShiningSoft. He has just excelle ...
- 动态规划:HDU1224-Free DIY Tour
Free DIY Tour Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- SPOJ:Free tour II (树分治+启发式合并)
After the success of 2nd anniversary (take a look at problem FTOUR for more details), this 3rd year, ...
- 【SPOJ】1825. Free tour II(点分治)
http://www.spoj.com/problems/FTOUR2/ 先前看了一会题解就自己yy出来了...对拍过后交tle.................. 自己造了下大数据........t ...
- HDU 1224 Free DIY Tour(spfa求最长路+路径输出)
传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1224 Free DIY Tour Time Limit: 2000/1000 MS (Java/Oth ...
- spoj 1825 Free tour II
http://www.spoj.com/problems/FTOUR2/ After the success of 2nd anniversary (take a look at problem FT ...
- SPOJ1825 FTOUR2 - Free tour II
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...
随机推荐
- jvm学习笔记一(垃圾回收算法)
一:垃圾回收机制的原因 java中,当没有对象引用指向原先分配给某个对象的内存时候,该内存就成为了垃圾.JVM的一个系统级线程会自动释放该内存块.垃圾回收意味着程序不再需要的对象是"无用信息 ...
- Node.js实战项目学习系列(3) CommonJS 模块化规范
前言 想开始编写Node.js代码,那么我们就必须先熟悉它的模块化规范CommonJS,本文将详细讲解CommonJS规范 本文代码 >>> github 地址 CommonJS N ...
- LINQ to SQL 的常见异常及解决办法
Ø 简介 本文主要介绍 LINQ to SQL 中常见的异常,以及对应的解决办法.包括以下内容: 1. 左连接情况下,右表非空类型字段可能抛出异常 1. 左连接情况下,右表非空类型字段可能抛 ...
- 9、el表达式的使用
一.EL表达式的作用: 1).使用变量访问web域中存储的对象 ${user } 2).访问javabean的属性 ${user.address.city } 3).执行基本的逻辑运算(el表达式 ...
- 练习:javascript淡入淡出半透明效果
划过无透明 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...
- swoole简单demo测试
测试代码 1.server.php: <?php $serv = new swoole_server("0.0.0.0", 9502); $serv->on('conn ...
- cvc-complex-type.2.4.a: Invalid content was found starting with element 'asy
- Linux内存管理 (22)内存检测技术(slub_debug/kmemleak/kasan)【转】
转自:https://www.cnblogs.com/arnoldlu/p/8568090.html 专题:Linux内存管理专题 关键词:slub_debug.kmemleak.kasan.oob. ...
- ospf的虚连接配置
作者:邓聪聪 配置OSPF虚连接 组网需求 在图1中,Area2没有与骨干区域直接相连.Area1被用作传输区域(Transit Area)来连接Area2和Area0.SwitchA.SwitchB ...
- spring中用到哪些设计模式?
设计模式作为工作学习中的枕边书,却时常处于勤说不用的尴尬境地,也不是我们时常忘记,只是一直没有记忆. Spring作为业界的经典框架,无论是在架构设计方面,还是在代码编写方面,都堪称行内典范.好了,话 ...