uva-1347

news/2025/4/1 7:35:27/

题目链接:https://vjudge.net/problem/UVA-1347

题意:有n个点,给出x、y坐标。找出一条路,从最左边的点出发,严格向右走到达最右点再严格向左回到最左点。问最短路径是多少?

不看题解我是真的不知道这个题可以用dp做,看了题解一脸懵(这都是些什么啊.......)(这个状态定义的太牛啤)

大体思路:用dp(i,j)表示A走到i,B走到j时的状态还需要走多远到终点,可以证明dp(i,j)==dp(j,i);dp(i,j)表示 已经 达到这个状态后还需要走多远到达终点,与怎么到达这个状态的并没有关系,所以dp(i,j)和dp(j,i)只是两个人角色对换了而已。 但这会出现一个问题,就是dp(i,j)无法知道i、j之间的某些点是否已经走过了,所以我们需要进一步思考,刚刚我们提到,dp(i,j)==dp(j,i),那么我们就可以始终让i>=j(等于只有终点和起点达到)。如果j>i了,只需要交换A、B的角色即可,即将i换为j,j换为i。 有了这个条件之后,我们就可以规定dp(i,j)规定为:A在i,B在j(i>=j)且i之前的所有点都走过了,这样也不会漏解,为什么呢?我们的自然的方法中,之所以i~j之间有点不知道走过了没,就是因为我们允许A连续走了多步,比如A从P1->P5->P6,而B可能从P1->P2。所以P3,P4我们不知道有没有被A或者B走到,因为我们只知道A走到了P6而B走到了P2。但是你明显发现了,在刚刚那个例子中,P3、P4之后必须要被B走到。所以我们改进的dp(i,j)中可以让A和B一格一格走,要么A走,要么B走(其实只是让顺序变化了一下而已)。有了刚刚的论证,我们的状态转移就变成了下面这样:
dp[i][j] = min(DP(i + 1, j) + dist(i, i + 1), DP(i + 1, i)+dist(j,i+1));即要么A走,要么B走,如果A走的话,那么走到状态dp(i+1,j);如果B走,那么走到状态dp(i,i+1)到要求前面大于后面,所以dp(i,i+1)==dp(i+1,i)即可。注意dist(i,j)表示i-j的距离。

#include <stdio.h>#include <string.h>#include <math.h>
#include <algorithm>
using namespace std;
const int N = 105;
const double INF = 0x3f3f3f3f3f3f3f3f;
int n;
double x[N], y[N], dp[N][N];
inline double dis (int a, int b) {return sqrt((x[a]-x[b])*(x[a]-x[b]) + (y[a]-y[b])*(y[a]-y[b]));}
void init () {for (int i = 1; i <= n; i++)scanf("%lf%lf", &x[i], &y[i]);memset(dp, 0, sizeof(dp));dp[2][1] = dis(1, 2);}
double solve () {for (int i = 3; i <= n; i++) {dp[i][i-1] = INF;for (int j = 1; j < i-1; j++) {dp[i][i-1] = min(dp[i][i-1], dp[i-1][j] + dis(i, j));dp[i][j] = dp[i-1][j] + dis(i, i-1);}}double ans = INF;for (int i = 1; i < n; i++)ans = min(ans, dp[n][i] + dis(n, i));return ans;}
int main () {while (scanf("%d", &n) == 1) {init ();printf("%.2lf\n", solve ());}return 0;

最后感谢这位博主:https://blog.csdn.net/qq_28236309/article/details/51931816




转载于:https://www.cnblogs.com/kayiko/p/10957858.html


http://www.ppmy.cn/news/191685.html

相关文章

mini计算机结构,简单拆机看内部构造_苹果 Mac mini MGEN2CH/A_台式电脑评测-中关村在线...

从整个外观设计来看,新Mac mini的变化确实不大,仅仅是在接口配置与布局方面有所不同,而内部变化在先前的拆机中有所展示,当然在此还是有必要重新梳理一边。首先新Mac mini的底盖圆盘的固定方式较之上一代产品有所改变,原先旋钮式固定方式变更为卡扣式固定,因此拆机时需要…

Mac Mini换固态硬盘

新年新气象&#xff0c;今天来把mini升级下&#xff0c;换个固态硬盘。 mini型号&#xff1a; A1347 &#xff0c; 2013版 材料&#xff1a; 固态硬盘一个&#xff0c;螺丝刀一套(里面需包含六角T6、T8和M2的螺丝刀)&#xff0c;U盘一个&#xff0c;拨片一个。如图&#xff1a;…

UVA1347 旅行

UVA1347 旅行 题目大意 给定 n n n 个点 ( x i , y i ) (x_i,y_i) (xi​,yi​)&#xff0c;从最左边的点出发到达最右边&#xff0c;再返回最左边&#xff0c;要求经过的点不重复且覆盖所有的点&#xff0c;求最小路径长&#xff08;两点的距离定义为欧几里得距离&#xff…

P1347 排序

题目描述 一个不同的值的升序排序数列指的是一个从左到右元素依次增大的序列&#xff0c;例如&#xff0c;一个有序的数列 A,B,C,DA,B,C,D 表示A<B,B<C,C<DA<B,B<C,C<D。在这道题中&#xff0c;我们将给你一系列形如 A<BA<B 的关系&#xff0c;并要求你…

mac mini php开发,苹果就不让你升级!新版mac mini真机详细拆解+解析(图)

历经两年多的沉默&#xff0c;小巧可爱的Mac mini终于升级了&#xff0c;带来了Intel Haswell处理器、Iris/HD5000核芯显卡、802.11ac Wi-Fi无线网卡、PCI-E固态硬盘等闪亮配置(不同型号不一样)&#xff0c;这些都是让人欣喜的地方。 但事实上&#xff0c;新款Mac mini处处都存…

第12章_数据库其它调优策略

第12章_数据库其它调优策略 1. 数据库调优的措施 1.1 调优的目标 尽可能 节省系统资源 &#xff0c;以便系统可以提供更大负荷的服务。&#xff08;吞吐量更大&#xff09; 合理的结构设计和参数调整&#xff0c;以提高用户操作 响应的速度 。&#xff08;响应速度更快&…

洛谷1347 排序

排序 一个不同的值的升序排序数列指的是一个从左到右元素依次增大的序列&#xff0c;例如&#xff0c;一个有序的数列 A,B,C,D 表示A<B,B<C,C<D。在这道题中&#xff0c;我们将给你一系列形如 A<B 的关系&#xff0c;并要求你判断是否能够根据这些关系确定这个数列…

新手Git+码云入门笔记

1.什么是Git&#xff1f; 2.什么是码云&#xff1f; 3.如何使用Git&#xff1f; 4.如何使用Git码云实现代码管理&#xff1f; 什么是Git&#xff1f; Git&#xff08;读音为/gɪt/&#xff09;是一个开源的分布式版本控制系统&#xff0c;可以有效、高速地处理从很小到非常大…