动态规划——Tour
来源:互联网 发布:淘宝刷单兼职靠谱吗 编辑:程序博客网 时间:2024/06/03 23:31
题意:按从左到右的顺序给出n个点,求从最左边到最右边再到最左边的最短距离(欧几里德距离)是多少。每个点只能走一次(除了最左边和最右边的点以外)。
思路:
这题在紫书(《算法竞赛入门经典(第2版)》)上作为例题讲过,复杂度是O(n2)。
因为从左到右再回来不方便思考,于是变成两个人同时从最左点出发,走不同的路到达最右点。
为了方便后续的转移,设置dp[i][j]表示1~max(i, j)都走过,且两人的位置分别是i和j时,此时还需要走的距离。
则可以明白dp[i][j]==dp[j][i],所以不妨规定i>j。
那么想走到下一步有两种走法
1.i走到i+1,则有dp[i+1][j]=min(dp[i+1][j], dp[i][j]+dis(i+1, i))
2.j走到i+1,则有dp[i+1][i]=min(dp[i+1][i], dp[i][j]+dis(i+1, j))
#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <cmath>#define INF 0x3f3f3f3fusing namespace std;const int maxn=1010;struct node{ double x, y;}point[maxn];double dis(int a, int b) //求欧几里德距离{ double dx=point[a].x-point[b].x; double dy=point[a].y-point[b].y; return sqrt(dx*dx+dy*dy);}int n;double dp[maxn][maxn];int main(){ while(~scanf("%d", &n)) { for(int i=0; i<n; i++) scanf("%lf%lf", &point[i].x, &point[i].y); for(int i=0; i<n; i++) for(int j=0; j<n; j++) dp[i][j]=INF; dp[0][0]=0; dp[1][0]=dis(1,0); for(int i=1; i<n; i++) for(int j=0; j<i; j++) { dp[i+1][j]=min(dp[i+1][j], dp[i][j]+dis(i, i+1)); dp[i+1][i]=min(dp[i+1][i], dp[i][j]+dis(i+1, j)); } double ans=INF*1.0; for(int i=0; i<n; i++) ans=min(ans, dp[n-1][i]+dis(n-1, i)); //枚举每个求最小 printf("%.2f\n", ans); } return 0;}
阅读全文
0 0
- 动态规划——Tour
- 动态规划 Interesting Tour hdu 3562
- UVa 1347 - Tour(动态规划)
- hdu1224 Free DIY Tour(动态规划)
- hdu1224 Free DIY Tour 动态规划
- 动态规划:HDU1224-Free DIY Tour
- hdu1224 Free DIY Tour【动态规划】
- 100道动态规划——1 UVA 1347 Tour 算法导论书后习题 双调巡游
- 动态规划——什么是动态规划?
- hdu 1224 Free DIY Tour(动态规划)
- HDOJ题目1224 Free DIY Tour(动态规划)
- 动态规划 — LIS
- 动态规划——Relocation 动态规划+状态压缩
- 动态规划——序
- 算法——动态规划
- 算法——动态规划
- 动态规划——最大值
- 动态规划——猴子
- 关于MPLS 技术及MPLS VPN的学习
- 度度熊与邪恶大魔王(2017"百度之星"程序设计大赛
- Matplotlib基础知识
- 51nod1109(01组成的n的倍数)
- Ubuntu 搭建强大的 IDE —— Vim + Vundle + 插件(上)
- 动态规划——Tour
- 接口测试—-中篇,通过django实现一个非常简单的记事本接口
- Java初学者必看
- Reverse Integer
- LVDS高速ADC接口, xilinx fpga实现
- 1240 莫比乌斯函数
- 【JZOJ 5231】 序列问题
- xadmin错误NameError:name 'reload' is not defined
- C# TextBox猜想输入和历史记录输入