https://cn.vjudge.net/problem/UVA-1347

这道题居然可以O(n^2)解决, 让我太吃惊了!!!

鄙人见识浅薄, 这其实是一个经典问题: bitonic tour.

它的定义是:

从最左点走到最右点在走回来, 不重复经过点, 最小需要多少路程.

在最左点走到最右点的过程中, 只走到比当前点x坐标大的点, 反之同理. (在该题中, 没有两个点x坐标重复)

要得出\(O(n^2)\)的DP算法, 需要几步转化:

首先, 计算从左到右再回来的路径长度很麻烦(因为这样回来时要标记所有走过的点, 状态\(2^n\)), 不可行.

可以看成有两个人从最左点出发, 经过不同的路径, 最后都走到了最右点.

然后, 为了防止集合的标记, 我们定义以下状态:

\[f(i, j) 表示 1... \max(i, j)都经过,第一个人到达i, 第二个人到达j的最短路长度.\\
不妨设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)的更多相关文章

  1. POJ2677 Tour[DP 状态规定]

    Tour Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4307   Accepted: 1894 Description ...

  2. POJ2677 Tour(DP+双调欧几里得旅行商问题)

    Tour Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 3929   Accepted: 1761 Description ...

  3. F - Free DIY Tour(动态规划,搜索也行)

    这道题可用动态规划也可以用搜索,下面都写一下 Description Weiwei is a software engineer of ShiningSoft. He has just excelle ...

  4. 动态规划:HDU1224-Free DIY Tour

       Free DIY Tour Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  5. SPOJ:Free tour II (树分治+启发式合并)

    After the success of 2nd anniversary (take a look at problem FTOUR for more details), this 3rd year, ...

  6. 【SPOJ】1825. Free tour II(点分治)

    http://www.spoj.com/problems/FTOUR2/ 先前看了一会题解就自己yy出来了...对拍过后交tle.................. 自己造了下大数据........t ...

  7. 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 ...

  8. spoj 1825 Free tour II

    http://www.spoj.com/problems/FTOUR2/ After the success of 2nd anniversary (take a look at problem FT ...

  9. SPOJ1825 FTOUR2 - Free tour II

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...

随机推荐

  1. [jzoj]4271. 【NOIP2015模拟10.27】魔法阵(37种转移的dp)

    题意不说 应该这辈子都不会忘记了... 这是我人生中做的最SB的一道DP题. 真的打的我心态崩了.... 可是竟然被我调出来了..... 也是没谁了... 我们设\(F[i][j][S]\)表示到第\ ...

  2. python 爬虫之beautifulsoup(bs4)环境准备

    环境准备: bs4安装方法:https://blog.csdn.net/Bibabu135766/article/details/81662981 requests安装方法:https://blog. ...

  3. linux系统无法启动或无法登入

    修改root权限: https://blog.csdn.net/houjue2298/article/details/78539827 修改密码: https://www.cnblogs.com/we ...

  4. mui扩展字体在哪里下载

    一次在一个知名前端模板网站上用积分下载了一个手机网页模板,没想到作者竟然玩起了删减隐藏,故意挖坑. 查看其原因是少一个mui.ttf的文件,纵然其他的文件及名称都有删改但无关紧要.也就是好多人搜索的m ...

  5. Mysql加锁过程详解(9)-innodb下的记录锁,间隙锁,next-key锁

    Mysql加锁过程详解(1)-基本知识 Mysql加锁过程详解(2)-关于mysql 幻读理解 Mysql加锁过程详解(3)-关于mysql 幻读理解 Mysql加锁过程详解(4)-select fo ...

  6. ACM-ICPC 2018 徐州赛区网络预赛 F Features Track(STL模拟)

    https://nanti.jisuanke.com/t/31458 题意 有N个帧,每帧有K个动作特征,每个特征用一个向量表示(x,y).两个特征相同当且仅当他们在不同的帧中出现且向量的两个分量分别 ...

  7. 第一节:.Net版基于WebSocket的聊天室样例

    一. 说在前面的话 该篇文章为实时通讯系列的第一节,基于WebSocket编写了一个简易版聊天样例,主要作用是为引出后面SignalR系列的用法及其强大方便之处,通过这个样例与后续的SignalR对比 ...

  8. SHAREDPOOL使用率的监控部署及思考

    [系统环境]: 系统环境:Sun Solaris10 U11  +  ORACLE  11.2.0.4.0  RAC [背景描述]: 从2016年11月起,生产的数据库期的出现了两次m0001进程12 ...

  9. 轴对称 Navier-Stokes 方程组的点态正则性准则 I

    在 [Lei, Zhen; Zhang, Qi. Criticality of the axially symmetric Navier-Stokes equations. Pacific J. Ma ...

  10. 玩转ubuntu之初体验

    安装的是ubuntu16.04.1,分区和具体细节就不多说了,非常简单 安装完之后要做的几件事: 1.设置root密码 #设置root密码 sudo passwd root 2.检查并更新系统 #ub ...