Tour(dp)

给定平面上n(n<=1000)个点的坐标(按照x递增的顺序),各点x坐标不同,且均为正整数。请设计一条路线,从最左边的点出发,走到最右边的点后再返回,要求除了最左点和最右点之外每个点恰好经过一次,且路径总长度最短。两点间的长度为它们的欧几里得距离。

首先转换一下题意,可以看作找到两条不相交(除了起点终点)且总长最短的路径。这种题型有一个套路,就是让两个点再路径上模拟前进。如果用\(d(i, j)\)表示第一个人走到i,第二个人走到j,那么就不能设计出转移方程,因为不能保证两个人不会走到相同的点。没有定义好状态,导致转移困难。

所以需要发现这道题的性质。走回头路肯定是不优的。因此,我们可以把状态修改为:\(d(i, j)\)表示1~max(i, j)全部走过,且两个人的当前位置分别是i和j,走过的最短距离。不难由对称性发现\(d(i, j)=d(j, i)\),因此,在状态中规定i>j。状态转移的关系是:\(d(i, j)\ to\ d(i+1, j)\ or\ d(i+1, i)\)。(本来是转移到i,i+1的,但是我们规定i>j)。至此状态转移方程就很明了了。这样的状态设计是包括所有可能正确的情况的。具体实现和边界处理参见代码。

#include <cmath>
#include <cstdio>
#include <algorithm>
using namespace std; const int maxn=1005, INF=1e9;
int n, x[maxn], y[maxn];
double f[maxn][maxn], ans; inline int sqr(int x){ return x*x; }
inline double dis(int a, int b){
return hypot(x[a]-x[b], y[a]-y[b]);
} int main(){
while (~scanf("%d", &n)){
for (int i=0; i<n; ++i)
scanf("%d%d", &x[i], &y[i]);
for (int i=0; i<n; ++i)
for(int j=0; j<n; ++j) f[i][j]=INF;
f[1][0]=0;
ans=INF;
for (int i=1; i<n; ++i){
for (int j=0; j<i; ++j) if (i!=n-1){
f[i+1][j]=min(f[i+1][j], f[i][j]+dis(i, i+1));
f[i+1][i]=min(f[i+1][i], f[i][j]+dis(j, i+1));
} else ans=min(ans, f[n-1][j]+dis(n-1, j));
}
printf("%.2lf\n", ans+dis(0, 1));
}
return 0;
}

Tour(dp)的更多相关文章

  1. LightOJ 1033 Generating Palindromes(dp)

    LightOJ 1033  Generating Palindromes(dp) 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid= ...

  2. lightOJ 1047 Neighbor House (DP)

    lightOJ 1047   Neighbor House (DP) 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=87730# ...

  3. UVA11125 - Arrange Some Marbles(dp)

    UVA11125 - Arrange Some Marbles(dp) option=com_onlinejudge&Itemid=8&category=24&page=sho ...

  4. 【POJ 3071】 Football(DP)

    [POJ 3071] Football(DP) Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4350   Accepted ...

  5. 初探动态规划(DP)

    学习qzz的命名,来写一篇关于动态规划(dp)的入门博客. 动态规划应该算是一个入门oier的坑,动态规划的抽象即神奇之处,让很多萌新 萌比. 写这篇博客的目标,就是想要用一些容易理解的方式,讲解入门 ...

  6. 2017百度之星资格赛 1003:度度熊与邪恶大魔王(DP)

    .navbar-nav > li.active > a { background-image: none; background-color: #058; } .navbar-invers ...

  7. Leetcode之动态规划(DP)专题-详解983. 最低票价(Minimum Cost For Tickets)

    Leetcode之动态规划(DP)专题-983. 最低票价(Minimum Cost For Tickets) 在一个火车旅行很受欢迎的国度,你提前一年计划了一些火车旅行.在接下来的一年里,你要旅行的 ...

  8. 最长公共子序列长度(dp)

    /// 求两个字符串的最大公共子序列长度,最长公共子序列则并不要求连续,但要求前后顺序(dp) #include <bits/stdc++.h> using namespace std; ...

  9. Leetcode之动态规划(DP)专题-647. 回文子串(Palindromic Substrings)

    Leetcode之动态规划(DP)专题-647. 回文子串(Palindromic Substrings) 给定一个字符串,你的任务是计算这个字符串中有多少个回文子串. 具有不同开始位置或结束位置的子 ...

随机推荐

  1. jQuery中的动画理论干货

    [jQuery中的动画] 通过jQuery动画能够轻松地为页面添加精彩的视觉效果 [show()方法和hide()方法]1.show()方法和hide()方法是jQUERY中最基本的动画方法,相当于在 ...

  2. Hibernate学习---第十节:Hibernate之QBC、样例查询&离线查询

    一.QBC (Query By Criteria) 主要有Criteria,Criterion,Oder,Restrictions类组成 1.java 代码如下: /** * 查询所有 */ @Tes ...

  3. Python基础-MD5加密

    import hashlibm = hashlib.md5()#构造一个md5 m.update(b"Hello")#加密前必须转化成二进制字节类型print(m.hexdiges ...

  4. JavaUtil_09_email_使用 commons-email 发送邮件

    二.参考资料 1.[commons]邮件发送工具——commons-email

  5. Linux_笔记_01_设置静态IP与 SecureCRT连接Linux

    步骤一至三,即可设置好静态IP 步骤四至九,使SecureCRT连接Linux 步骤一:编辑ifcfg-eth0 文件 1.打开ifcfg-eth0 文件 使用命令:vi /etc/sysconfig ...

  6. OpenCV-Python 霍夫直线检测-HoughLinesP函数参数

    cv2.HoughLines()函数是在二值图像中查找直线,cv2.HoughLinesP()函数可以查找直线段. cv2.HoughLinesP()函数原型: HoughLinesP(image, ...

  7. ngCookies都做了什么

    根据官方的api文档,ngCookies的$cookieStore服务,提供了这样几个方法: 1.get(key); 2.put(key, value); 3.remove(key); 以上方法都是对 ...

  8. JS之事件监听

    一 如果事件监听类似于如下写法,则最终只会执行最后一个事件监听,其他监听都会被覆盖掉. window.onload=funtion(){console.log(1);}; window.onload= ...

  9. 彻底删除kafka下面的topic

    如果只是用kafka-topics.sh的delete命令删除topic,会有两种情况: 如果当前topic没有使用过即没有传输过信息:可以彻底删除 如果当前topic有使用过即有过传输过信息:并没有 ...

  10. mongodb 的命令操作(转)

    成功启动MongoDB后,再打开一个命令行窗口输入mongo,就可以进行数据库的一些操作. 输入help可以看到基本操作命令: show dbs:显示数据库列表  show collections:显 ...