1163. Tour
题目大意:
就是一个双调旅程问题,从最左边的点走到最右边的点,然后从最右边走回最左边,问这段旅程的最短距离。
解题思路:
题目已经告诉我们,所有的点已经按照左到右的顺序输入了。
题目可以转换成,从第一个点出发,分两路A,B走,最后汇集到第n个点。
用动态规划:
dp[i][j]表示A到达i点,B到达j点时的最短路径。我们始终考虑i>=j,根据对称性可以得出其余解
于是dp[n][n]表示最终解。
当前的状态为dp[i][j],分情况:
- j != i - 1 时:此时dp[i-1][j]再通过从点i-1到i即可。
- j == i - 1 or j == i时:此时需要遍历取最小值
代码如下:
/*
* main.cpp
*
* Created on: Sep 24, 2011
* Author: raphealguo
*/
#include <stdio.h>
#include <iostream>
#include <string.h>
#include <math.h>
using namespace std;
#define MAXL 1010
struct Point{
int x;
int y;
};
double dis(Point p1, Point p2){
return sqrt((p1.x-p2.x)*(p1.x-p2.x) + (p1.y-p2.y)*(p1.y-p2.y));
}
int main(){
int n;
int i, j;
Point p[MAXL];
double dp[MAXL][MAXL];
while (scanf ("%d", &n) != EOF){
for (i = 1; i <= n; ++i){
scanf("%d %d", &p[i].x, &p[i].y);
}
memset(dp, 0, sizeof(dp));
dp[1][1] = 0;
for (i = 1; i <= n; ++i){
for (j = 1; j < i; ++j){
if (dp[i][j] == 0){//第一次赋值
dp[i][j] = dp[i-1][j] + dis(p[i], p[i-1]);
}else{
dp[i][j] = min(dp[i][j], dp[i-1][j] + dis(p[i], p[i-1]));
}
if (dp[i][i-1] == 0){//第一次赋值
dp[i][i-1] = dp[i-1][j] + dis(p[i], p[j]);
}else{
dp[i][i-1] = min(dp[i][i-1], dp[i-1][j] + dis(p[i], p[j]));
}
if (dp[i][i] == 0){//第一次赋值
dp[i][i] = dp[i][j] + dis(p[i], p[j]);
}else{
dp[i][i] = min(dp[i][i], dp[i][j] + dis(p[i], p[j]));
}
}
}
printf ("%.2lf\n", dp[n][n]);
}
return 0;
}
附带原题:
1163. Tour
Description
John Doe, a skilled pilot, enjoys traveling. While on vacation, he rents a small plane and starts visiting beautiful places. To save money, John must determine the shortest closed tour that connects his destinations. Each destination is represented by a point in the plane pi = . John uses the following strategy: he starts from the leftmost point, then he goes strictly left to right to the rightmost point, and then he goes strictly right back to the starting point. It is known that the points have distinct x-coordinates.
Write a program that, given a set of n points in the plane, computes the shortest closed tour that connects the points according to John's strategy.
Input
Each data set in the file stands for a particular set of points. For each set of points the data set contains the number of points, and the point coordinates in ascending order of the x coordinate. White spaces can occur freely in input. The input data are correct.
Output
For each set of data, your program should print the result to the standard output from the beginning of a line. The tour length, a floating-point number with two fractional digits, represents the result. An input/output sample is in the table below. Here there are two data sets. The first one contains 3 points specified by their x and y coordinates. The second point, for example, has the x coordinate 2, and the y coordinate 3. The result for each data set is the tour length, (6.47 for the first data set in the given example).
Sample Input
3
1 1
2 3
3 1
4
1 1
2 3
3 1
4 2
Sample Output
6.47
7.89
分享到:
相关推荐
在 sicily 上的题目,通常会涉及到排序、搜索、图论、动态规划、贪心算法、回溯算法等经典算法。每种算法都有其特定的应用场景和优缺点,理解并掌握它们是成为一名优秀程序员的关键。 1. **排序算法**:如快速排序...
5. **Poor contestant Prob**:题目名称暗示可能是一个概率问题,需要理解概率理论和随机过程,可能涉及到动态规划或蒙特卡洛模拟来求解。 6. **MJ, Nowhere to Hide**:可能是一个搜索或图遍历问题,比如深度优先...
这些题目可能涵盖了不同的难度等级和数据结构应用,如排序、搜索、图论、动态规划等。 标签 "1876 sicily_1022 sicily_1934 sicily_soj_ip" 进一步强调了问题的编号和主题。这里 "IP" 可能指的是 "Interactive ...
算法方面,排序(如冒泡排序、快速排序、归并排序)和查找(如二分查找、哈希查找)是基础,而动态规划、贪心算法、回溯法等更高级的策略则常常出现在复杂的竞赛题目中。 "C++ for sicily.doc"文档可能涵盖了这些...
2. **算法和数据结构**:查找并学习使用的算法和数据结构,如排序、搜索、图论、动态规划等。 3. **编程语言特性**:根据源代码的语言,学习和熟悉特定语言的语法和最佳实践。 4. **设计模式**:识别和理解代码中...
中大sicily online judge的刷题指南,里面介绍得很详细,不过,最近sicily好像不能外网访问了。
3. **算法与数据结构**:参考代码中很可能包含了各种算法实现,如排序、搜索、图论、动态规划等。数据结构如数组、链表、树、图、哈希表等也可能是重点。理解这些算法和数据结构的原理及其应用是提升编程能力的关键...
sicily 1562_LVM.cpp参考代码
"Sicily_Queue.rar_sicily"这个压缩包文件显然包含了与在Sicily平台上实现高效队列操作相关的代码或文档。 首先,我们需要理解队列的基本概念。队列就像一个等待服务的队伍,新进来的元素(入队)会排在队伍的末尾...
本cpp是sicily的1006的解题代码 这份代码以最简单的方式实现了它的功能要求 值得学习一番
【标题】"sicily1294.rar_1294_sicily" 提供的信息表明,这可能是一个与中山大学ACM竞赛相关的代码压缩包,其中包含了对问题1294 "Sicily"的解决方案。在ACM(国际大学生程序设计竞赛,International Collegiate ...
在 sicily 平台上,题目涉及的编程语言可能包括但不限于 Python、Java、C++、JavaScript 等,而解题思路可能涉及到排序算法(如冒泡排序、快速排序)、搜索算法(如二分查找、深度优先搜索)、动态规划、图论、字符...
sicily1007题答案,附代码解释,可以在平台上通过
对于题目1093和1888,它们的具体内容和要求是未知的,可能涉及到排序、搜索、图论、动态规划、字符串操作等各种算法和问题领域。要完全理解这些代码,我们需要查看题目描述,这通常会提供输入格式、输出要求、示例...
3. **数据结构与算法**:作为学术项目,可能涉及到复杂的数据结构(如链表、树、图)和算法(排序、搜索、动态规划等),这些都是计算机科学的基础。 4. **软件工程**:项目可能遵循软件工程的原则,包括需求分析、...
【标题】"sicily-code--3.rar_sicily" 提供的是中山大学sicily课程相关的编程参考资料,这可能是一门涵盖计算机科学与信息技术的课程,其中涉及到的代码可能是用于教学或者项目实践。从描述来看,这个压缩包包含了...
在“sicily_source.zip_sicily”这个压缩包文件中,我们主要关注的是与西西里相关的编程练习,这些练习涵盖了输入输出操作和标准程序设计,同时也涉及到超高精度浮点数的输出问题以及关联数组这一数据结构。...
- "robot.cpp" 文件的名称没有明确指明具体主题,但考虑到 sicily online judge 的背景,这可能是一个关于机器人路径规划或运动控制的编程问题,可能涉及到搜索算法(如深度优先搜索或广度优先搜索)或图论中的移动...