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/ ...
随机推荐
- elasticsearch篇之mapping
2018年05月17日 18:01:37 lyzkks 阅读数:444更多 个人分类: Elastic stack 版权声明:文章内容来自于网络和博主自身学习体会,转载请注明出处,欢迎留言大家一起 ...
- CodeForces 70
题目 A题 #include<bits/stdc++.h> using namespace std; int n,b,sum; int main(){ scanf("%d&quo ...
- Centos7 升级内核版本
1.查看当前内核版本 $ uname -r -.el7.x86_64 $ uname -a Linux k8s-master -.el7.x86_64 # SMP Tue Nov :: UTC x86 ...
- 金融量化分析【day111】:Pandas-分组与聚合
一.分组与聚合 在数据分析中,我们有时需要将数据拆分,在每一个特定的组里进行运算 1.实验数据准备 a = pd.read_csv('601318.csv') a 数据如下: 实验数据 2.示例 df ...
- Python 各种进制转换
#coding=gbk var=input("请输入十六进制数:") b=bin(int(var,16)) print(b[2:]) 详细请参考python自带int函数.bin函 ...
- JN_0001:在微信朋友圈分享时长大于10s的视频
1,先在聊天窗口里发送视频. 2,长按视频点击”收藏“. 3,进入微信收藏管理页面,播放视频. 4,点击右上角三点按钮,选择“转存为笔记”. 5,于是在收藏页面中会生成一个新的收藏笔记链接,打开链接再 ...
- Pytorch中的自动求导函数backward()所需参数含义
摘要:一个神经网络有N个样本,经过这个网络把N个样本分为M类,那么此时backward参数的维度应该是[N X M] 正常来说backward()函数是要传入参数的,一直没弄明白backward需要传 ...
- Thread和Runnable的区别
Runnable源码 Thread源码 结论 Thread实现了Runnable接口的类,使得run支持多线程. 因类的单一继承原则,推荐使用Runnable接口实现多线程
- 微信小程序scroll-view(或者其他view) 计算高度 px转rpx有关
wx.getSystemInfo({ success: function (res) { that.globalData.winWidth = res.windowWidth; that.global ...
- 肺结节CT影像特征提取(三)——肺结节CT影像特征提取系统软件设计
肺结节的特征提取在临床中有着重要应用,在上篇文章已经对肺结节的基本特征和CT影像特征提取算法有了介绍,提出了三类肺结节CT影像特征提取算法.本文重点介绍肺结节CT影像特征提取系统的功能介绍及使用,利用 ...