紫书P269-uva1347题解,结合紫书解析加入了一些个人理解

2023-11-20 17:32

本文主要是介绍紫书P269-uva1347题解,结合紫书解析加入了一些个人理解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

该题在vjudge上的链接
在紫书的动态规划那一节看到了这道题。结合刘汝佳的解析,在代码里加了一些个人的理解,已经提交UVA通过。

//将问题看做两个人从起点出发,不能走重复的点,计算两个人到达终点时走过的距离和
#include <bits/stdc++.h>
#define mem(a, b) memset(a, b, sizeof(a))
#define scf(a) scanf("%d", &a)
#define scf2(a, b) scanf("%d%d", &a, &b)
using namespace std;struct point
{int x, y;
} p[1001];//dp[i][j]表示一个人在i,一个人在j,二者到终点还差的距离和,且1到i的点已经全部走过
//因为dp[i][j]==dp[j][i],所以规定i>j,因为两人不能在同一个点,所以i!=j
//状态方程为dp[i][j]=min(dp[i+1][j]+dist(i,i+1),dp[i+1][i]+dist(j,i+1));
//一种是让处于i的人走,一种是让处于j的人走,且下一步必须走到i+1,不能走其他地方
//对于这种走法是否存在漏解的说明:这种走法依然能遍历到所有二者位置的状态,
//且在遍历dp[i][j]之前,dp[x>=i][y>=j]的结果都已确定(见cal函数的递归实现),可以保证dp[i][j]的正确性
double dp[1001][1001];double dist(int a, int b) //传入两个点的下标,计算二者距离
{int dx = p[a].x - p[b].x, dy = p[a].y - p[b].y;return sqrt(dx * dx + dy * dy);
}double cal(int i, int j) //计算并返回dp[i][j]的值,递归实现
{if (dp[i][j] != 0)return dp[i][j];//在两个人中选取一个人走到i+1//走了之后要加上dist(o->e)的距离dp[i][j] = min(cal(i + 1, j) + dist(i, i + 1), cal(i + 1, i) + dist(j, i + 1));return dp[i][j];
}int main()
{mem(dp, 0);int n;while (scf(n)!=EOF){mem(dp,0);for (int i = 1; i <= n; i++){scf2(p[i].x, p[i].y);}double dis = dist(n, n - 1); //n到n-1的距离,减少重复计算/*  计算一个人处于n-1,另一个人处于j时,距离终点还有多远,因为dp[i][j](i>j)表示i内的点都已经走过,所以dp[n-1][j]就只剩下了n可以走,所以距离是唯一确定的也就是n-1到n的距离加上j到n的距离*/for (int j = 1; j < n - 1; j++){dp[n - 1][j] = dis + dist(j, n);}printf("%.2lf\n", cal(2, 1) + dist(1, 2));}return 0;
}/*样例数据3
1 1
2 3
3 1
4
1 1
2 3
3 1
4 2*/

这篇关于紫书P269-uva1347题解,结合紫书解析加入了一些个人理解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/396291

相关文章

深入解析 Java Future 类及代码示例

《深入解析JavaFuture类及代码示例》JavaFuture是java.util.concurrent包中用于表示异步计算结果的核心接口,下面给大家介绍JavaFuture类及实例代码,感兴... 目录一、Future 类概述二、核心工作机制代码示例执行流程2. 状态机模型3. 核心方法解析行为总结:三

springboot项目中使用JOSN解析库的方法

《springboot项目中使用JOSN解析库的方法》JSON,全程是JavaScriptObjectNotation,是一种轻量级的数据交换格式,本文给大家介绍springboot项目中使用JOSN... 目录一、jsON解析简介二、Spring Boot项目中使用JSON解析1、pom.XML文件引入依

Python中文件读取操作漏洞深度解析与防护指南

《Python中文件读取操作漏洞深度解析与防护指南》在Web应用开发中,文件操作是最基础也最危险的功能之一,这篇文章将全面剖析Python环境中常见的文件读取漏洞类型,成因及防护方案,感兴趣的小伙伴可... 目录引言一、静态资源处理中的路径穿越漏洞1.1 典型漏洞场景1.2 os.path.join()的陷

C#代码实现解析WTGPS和BD数据

《C#代码实现解析WTGPS和BD数据》在现代的导航与定位应用中,准确解析GPS和北斗(BD)等卫星定位数据至关重要,本文将使用C#语言实现解析WTGPS和BD数据,需要的可以了解下... 目录一、代码结构概览1. 核心解析方法2. 位置信息解析3. 经纬度转换方法4. 日期和时间戳解析5. 辅助方法二、L

Mybatis Plus JSqlParser解析sql语句及JSqlParser安装步骤

《MybatisPlusJSqlParser解析sql语句及JSqlParser安装步骤》JSqlParser是一个用于解析SQL语句的Java库,它可以将SQL语句解析为一个Java对象树,允许... 目录【一】jsqlParser 是什么【二】JSqlParser 的安装步骤【三】使用场景【1】sql语

SpringBoot整合Sa-Token实现RBAC权限模型的过程解析

《SpringBoot整合Sa-Token实现RBAC权限模型的过程解析》:本文主要介绍SpringBoot整合Sa-Token实现RBAC权限模型的过程解析,本文给大家介绍的非常详细,对大家的学... 目录前言一、基础概念1.1 RBAC模型核心概念1.2 Sa-Token核心功能1.3 环境准备二、表结

Java 关键字transient与注解@Transient的区别用途解析

《Java关键字transient与注解@Transient的区别用途解析》在Java中,transient是一个关键字,用于声明一个字段不会被序列化,这篇文章给大家介绍了Java关键字transi... 在Java中,transient 是一个关键字,用于声明一个字段不会被序列化。当一个对象被序列化时,被

Java JSQLParser解析SQL的使用指南

《JavaJSQLParser解析SQL的使用指南》JSQLParser是一个Java语言的SQL语句解析工具,可以将SQL语句解析成为Java类的层次结构,还支持改写SQL,下面我们就来看看它的具... 目录一、引言二、jsQLParser常见类2.1 Class Diagram2.2 Statement

python进行while遍历的常见错误解析

《python进行while遍历的常见错误解析》在Python中选择合适的遍历方式需要综合考虑可读性、性能和具体需求,本文就来和大家讲解一下python中while遍历常见错误以及所有遍历方法的优缺点... 目录一、超出数组范围问题分析错误复现解决方法关键区别二、continue使用问题分析正确写法关键点三

使用Java实现Navicat密码的加密与解密的代码解析

《使用Java实现Navicat密码的加密与解密的代码解析》:本文主要介绍使用Java实现Navicat密码的加密与解密,通过本文,我们了解了如何利用Java语言实现对Navicat保存的数据库密... 目录一、背景介绍二、环境准备三、代码解析四、核心代码展示五、总结在日常开发过程中,我们有时需要处理各种软