UVa 1347 Tour
来源:互联网 发布:如何创建域名 编辑:程序博客网 时间:2024/06/06 11:42
来源:UVa 1347、PKU程序设计实习课程练习
题目描述:
给定n个平面上的点的坐标,求出从最左边的点严格向右走到最右边的点,再严格向左走到最左边的点,并且所有点都经过恰好一次的走法,结果输出该走法距离.
题目分析:
首先给郭神的搜索算法跪了,本质上和dp差不到哪里去.我一开始是不会做的,直到今天早上翻到算导动归一章看到描述完全相同的所谓”双调欧几里得旅行商问题”,根据它给的Hint才勉强想了出来
总的来说,先按x坐标从小到大排序.把状态定义成为dp[i][j](i< j)表示从i严格向左走到0点,再严格向右走到j点的最短距离.那么问题可以归结为以下两种子问题:
最后答案就是
此外必须要指明的是动态规划的初始状态和规划方向,初始状态是
// Created by wander on 16/6/11.// Copyright © 2016年 W4anD0eR96. All rights reserved.#include "bits/stdc++.h"using namespace std;#define x first#define y secondtypedef pair<double, double> P;int n;double Dist(P a, P b) { return sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y- b.y)); }int main() {#ifdef DEBUG freopen("in", "r", stdin); freopen("out", "w", stdout);#endif while (~scanf("%d", &n)) { double res, dp[60][60] = {}; P dots[60]; for (int i = 0; i < n; i += 1) scanf("%lf%lf", &dots[i].x, &dots[i].y); sort(dots, dots + n); dp[0][1] = Dist(dots[0], dots[1]); for (int i = 2; i < n; i += 1) { dp[i - 1][i] = 1e30; for (int j = 0; j < i - 1; j += 1) { dp[i - 1][i] = min(dp[i - 1][i], dp[j][i - 1] + Dist(dots[j], dots[i])); dp[j][i] = dp[j][i - 1] + Dist(dots[i - 1], dots[i]); } } res = 1e30; for (int i = 0; i < n - 1; i += 1) res = min(res, dp[i][n - 1] + Dist(dots[i], dots[n - 1])); printf("%.2lf\n", res); } return 0;}
- uva 1347 - Tour
- Tour - UVa 1347 dp
- UVa 1347 Tour(DP)
- UVa 1347 Tour(DP)
- UVA 1347 Tour DP
- UVa - 1347 - Tour
- UVA - 1347 Tour
- uva 1347 tour
- uva 1347 tour
- uva 1347 Tour 旅行
- UVA 1347 Tour
- UVa 1347 Tour
- uva 1347 Tour
- UVa 1347 Tour
- UVA 1347 Tour
- UVa OJ 1347 - Tour
- uva 1347 tour
- Tour UVa 1347
- 【网络编程2】Java数据报套接字
- R语言︱线性混合模型理论与案例探究(固定效应&随机效应)
- leetcode-Ugly Number(丑数)
- 【Windows】教你一步一步在Windows 7 系统上开启Telnet服务
- Xcode各版本官方下载及百度云盘下载, Mac和IOS及Xcode版本历史.
- UVa 1347 Tour
- Android学习笔记之SimpleAdapter
- orcale 忘记密码
- 在ubuntu14.04.1中将qt4.8.6移植到基于hi3520d的nvr上
- Exchange 2010 Powershell之Search-MailBox!
- 扑克牌顺子
- JS去重方法
- 不得姐实战教程 02 配置tabbar
- 我的第一篇博客,决定做点技术