POJ2677--Tour DP
来源:互联网 发布:嘀哩嘀哩 知乎 编辑:程序博客网 时间:2024/06/05 16:17
题目链接:
http://poj.org/problem?id=2677
题目大意:
- 给定二维平面上的n个点
- 从最左端点到最右端点(只能向右移动)
- 再返回到到起点(只能向左移动)
- 除起点和终点外所有点只能经过一次
- 求经过的距离最短是多少
解题思路:
考虑到是走来回,我们就可以转换为两个人同时走单程。
那么定义状态f[i][j]表示:前i个点都已走过且保证合法的情况下,走得快的在i,慢的在j时经过距离的最小值。
那么就有以下两种状态可以转移:
1. i是由原来走得快的人走到的:f[i][j] = f[i-1][j]+dis(i,i-1)
2. i是由原来走得慢的人走到的:f[i][i-1] = f[i-1][j]+dis(i, j)
所以最后状态就是快的人已经走到n,而慢的人还在中间某个点。而答案就是f[n][k]+dis(n,k)
Code:
#include <cmath>#include <cstdio>#include <algorithm>using namespace std;const int MAXN = 1005;const int INF = 0x3f3f3f3f;int n, x[MAXN], y[MAXN];double f[MAXN][MAXN];double dis[MAXN][MAXN];inline double Dis(int i, int j){ int X = x[i]-x[j], Y = y[i]-y[j]; return sqrt(X*X+Y*Y);}int main(){ while(scanf("%d",&n) != EOF){ for(int i = 1; i <= n; ++ i) scanf("%d%d",&x[i],&y[i]); for(int i = 1; i <= n; ++ i) for(int j = 1; j <= i; ++ j){ dis[i][j] = dis[j][i] = Dis(i, j); f[i][j] = f[j][i] = 1.0*INF; } f[1][1] = 0; for(int i = 2; i <= n; ++ i) for(int j = 1; j < i; ++ j){ f[i][j] = min(f[i][j], f[i-1][j]+dis[i][i-1]); f[i][i-1] = min(f[i][i-1], f[i-1][j]+dis[i][j]); } double ans = 1.0*INF; for(int i = 1; i < n; ++ i) ans = min(ans, f[n][i]+dis[i][n]); printf("%.2lf\n",ans); } return 0;}
阅读全文
0 0
- POJ2677--Tour DP
- ZOJ2581 POJ2677 Tour,双调DP
- UVa1347/poj2677 - C - Tour(DP)
- POJ2677 Tour(DP:双调巡游)
- POJ2677.Tour
- POJ2677 DP tour 双调欧几里得旅行商问题
- poj2677
- POJ2677
- hdu2224——The shortest path && POJ2677——Tour
- 双调旅程(bitonic tour)问题(POJ2677、ZOJ2096)
- Poj 2677 Tour//DP
- Tour - UVa 1347 dp
- UVa 1347 Tour(DP)
- UVa 1347 Tour(DP)
- UVA 1347 Tour DP
- uva1347 - Tour DP
- 1347 - Tour(DP)
- hdoj1224Free DIY Tour【dp】
- Fair Division
- 母函数 HDU-1171 Big Event in HDU
- iOS与安卓的区别 浅谈ios为什么比安卓流畅
- CSU 1811 Tree Intersection(莫队算法)
- C++中直接拒绝编译器自动生成copy constructor和copy operator=操作(6)---《Effective C++》
- POJ2677--Tour DP
- 期望DP入门(POJ 1190 ,POJ 2609)
- qduoj LC的课后辅导(单调栈)
- [RK3288][Android6.0] 调试笔记 --- 如何修改/dev/ttySx后面的数字号
- 线程同步的方式
- PLSQL与SQL执行有什么不同
- Electron: HTML + Javascript 开发桌面应用程序
- Oracle查询最近几天,每小时归档日志产生数量--脚本
- Android读取第三方应用列表并卸载