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/ ...
随机推荐
- 什么是Tensor
https://blog.csdn.net/kansas_lh/article/details/79321234 tensor是tensorflow基础的一个概念——张量. Tensorflow用到了 ...
- Vue, React, AngularJS, Angular2 我们对流行JavaScript框架们的选择
转自<奇舞周刊>,好文章mark一下 分割线 一个有趣的事实是:IBM发表的2017年最值得学习的编程语言名单中,JavaScript榜上有名.这位IT巨头指出,JS在网站中惊人地达到94 ...
- redis-sentinel高可用配置(2)
一:说明 前面我们已经配置了redis的主从配置(链接),这种主从架构有一个问题,当主master出现了故障了,怎么切换到从服务器上呢? 第一种:手动切换, 这种肯定会造成比较长一段时间的用户不能访问 ...
- python之路(1)数据类型
目录 整型 布尔值 字符串 列表 元组 字典 整型(int) 将字符串转换成整型 num = "123" v = int(num) 2. 将字符串按进制位转换成整型 num = & ...
- Nginx 站点设置目录列表显示
Nginx 站点目录列表显示. 可以编辑添加在 server { } 模块 或者 location { } 模块下. autoindex on; # 开启目录文件列表 autoindex_exact_ ...
- UE导航系统详
配置 Navigation Crowd Manager Class 代理人管理类 可以自定义个 Navigation System Auto Create Navigation Data 导航数据在没 ...
- 消除导入MNIST数据集发出的警告信息
原本导入数据集你仅需这样: # Import MNIST data from tensorflow.examples.tutorials.mnist import input_data mnist = ...
- 5.CentOS7安装MySQL
在CentOS中默认安装有MariaDB,这个是MySQL的分支,但为了需要,还是要在系统中安装MySQL,而且安装完成之后可以直接覆盖掉MariaDB. 1 下载并安装MySQL官方的 Yum Re ...
- 用juery的ajax方法调用aspx.cs页面中的webmethod方法
首先在 aspx.cs文件里建一个公开的静态方法,然后加上WebMethod属性. 如: [WebMethod] public static string GetUserName() { //.... ...
- redis 远程操作命令
在远程服务上执行命令 如果需要在远程 redis 服务上执行命令,同样我们使用的也是 redis-cli 命令. 语法 $ redis-cli -h host -p port -a password ...