计算机算法分析与设计(10)---租用游艇问题(含C++代码)

2023-10-15 06:45

本文主要是介绍计算机算法分析与设计(10)---租用游艇问题(含C++代码),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

    • 1、问题描述
    • 2、代码分析(用动态规划思路)
    • 3、代码分析(用Dijkstra算法思路)


1、问题描述

 长江游艇俱乐部在长江上设置了 n n n 个游艇出租站 1 , 2 , … … , n 1,2,……,n 1,2,……,n。游客可在这些游艇出租站租用游艇,并在下游的任何一个游艇出租站归还游艇。游艇出租站i到游艇出租站 j j j 之间的租金为 r ( i , j ) , 1 < = i < j < = n r(i,j),1<=i<j<=n r(i,j)1<=i<j<=n。试设计一个算法,计算出从游艇出租站 1 1 1 到游艇出租站 n n n 所需的最少租金。

 输入格式:第 1 1 1 行中有 1 1 1 个正整数 n ( n < = 200 ) n(n<=200) nn<=200,表示有 n n n 个游艇出租站。接下来的第 1 1 1 到第 n − 1 n-1 n1 行,第 i i i 行表示第 i i i 站到第 i + 1 i+1 i+1 站、第 i + 2 i+2 i+2 站、 … 、第 n n n 站的租金。

 输出格式:输出从游艇出租站 1 1 1 到游艇出租站 n n n 所需的最少租金。

输入样例:
3
5 15
7
输出样例:
12

2、代码分析(用动态规划思路)

 1. 本题采用动态规划思路来解决,需要写出递归方程。

 2. 本题的思路和矩阵链相乘思路很相似,但递推方程不一样。租用游艇:比如从 1 1 1 3 3 3,然后从 3 3 3 n n n ;矩阵链:比如从 1 1 1 3 3 3,那么接下来就是 4 4 4 n n n

 3. 思路:中间位置划分:i -> k ->j。即分为 r[i][j] -> r[i][k] + r[k][j]。由于是最少租金,初始时 dp[i][j] = r[i][j]。状态转移方程为 dp[i][j] = min(dp[i][k] + dp[k][j]), k = [i+1 , j-1]

时间复杂度 O ( n 3 ) O(n^3) O(n3)

#include<bits/stdc++.h>
using namespace std;
int main()
{int n, r[300][300], dp[300][300];cin >> n;for(int i = 1; i <= n; i++) //出租站i到i的租金为0 {r[i][i] = dp[i][i] = 0;}for(int i = 1; i <= n - 1; i++) //输入出租站i到i+1的租金 {for(int j = i + 1; j <= n; j++){cin >> r[i][j];dp[i][j] = r[i][j];}}for(int i = 1; i <= n - 1; i++){for(int j = i + 1; j <= n; j++){ for(int k = i + 1; k <= j - 1; k++){dp[i][j] = min(dp[i][j], dp[i][k] + dp[k][j]);}}}cout << dp[1][n];return 0;
} 

3、代码分析(用Dijkstra算法思路)

 1. 由于Dijkstra算法用于最短距离,所以这里我们用距离代替租金(本质是一样的)。

 2. 先用一个 d i s [ j ] dis[j] dis[j] 来存储站 1 1 1 到站 2 2 2,站 3 3 3 … 站 n n n 的最短距离,刚开始 d i s dis dis 的初始距离就是 r [ 1 ] [ j ] r[1][j] r[1][j] 的距离。

 3. 之后我们遍历查找确定其他的最小距离。因为前面 1 1 1 2 2 2 已经确认所以我们从 i=3 开始, j j j 从确定好的里面进行挑选,当 dis[i]>dis[j]+r[j][i] 时进行更新。最后输出 d i s [ n ] dis[n] dis[n]

时间复杂度 O ( n 2 ) O(n^2) O(n2)

#include<bits/stdc++.h>
using namespace std;
//这里用距离代替租金 
int main()
{int n;cin >> n;int r[n][n], dis[n];for(int i = 1; i <= n; i++) //出租站i到i的距离为0 {r[i][i] = 0;}for(int i = 1; i <= n - 1; i++) //输入出租站i到i+1的距离 {for(int j = i + 1; j <= n; j++){cin >> r[i][j];}}dis[0] = dis[1] = 0;for(int j = 2; j <= n; j++){dis[j] = r[1][j]; //dis的初始距离就是r[1][j]的距离}for(int i = 3; i <= n; i++){for(int j = 1; j <= i-1 ; j++){if(dis[i] > dis[j] + r[j][i]){dis[i] = dis[j] + r[j][i];}}}cout << dis[n];return 0;
} 

这篇关于计算机算法分析与设计(10)---租用游艇问题(含C++代码)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

vscode保存代码时自动eslint格式化图文教程

《vscode保存代码时自动eslint格式化图文教程》:本文主要介绍vscode保存代码时自动eslint格式化的相关资料,包括打开设置文件并复制特定内容,文中通过代码介绍的非常详细,需要的朋友... 目录1、点击设置2、选择远程--->点击右上角打开设置3、会弹出settings.json文件,将以下内

C++中使用vector存储并遍历数据的基本步骤

《C++中使用vector存储并遍历数据的基本步骤》C++标准模板库(STL)提供了多种容器类型,包括顺序容器、关联容器、无序关联容器和容器适配器,每种容器都有其特定的用途和特性,:本文主要介绍C... 目录(1)容器及简要描述‌php顺序容器‌‌关联容器‌‌无序关联容器‌(基于哈希表):‌容器适配器‌:(

SQL Server使用SELECT INTO实现表备份的代码示例

《SQLServer使用SELECTINTO实现表备份的代码示例》在数据库管理过程中,有时我们需要对表进行备份,以防数据丢失或修改错误,在SQLServer中,可以使用SELECTINT... 在数据库管理过程中,有时我们需要对表进行备份,以防数据丢失或修改错误。在 SQL Server 中,可以使用 SE

大数据小内存排序问题如何巧妙解决

《大数据小内存排序问题如何巧妙解决》文章介绍了大数据小内存排序的三种方法:数据库排序、分治法和位图法,数据库排序简单但速度慢,对设备要求高;分治法高效但实现复杂;位图法可读性差,但存储空间受限... 目录三种方法:方法概要数据库排序(http://www.chinasem.cn对数据库设备要求较高)分治法(常

Vue项目中Element UI组件未注册的问题原因及解决方法

《Vue项目中ElementUI组件未注册的问题原因及解决方法》在Vue项目中使用ElementUI组件库时,开发者可能会遇到一些常见问题,例如组件未正确注册导致的警告或错误,本文将详细探讨这些问题... 目录引言一、问题背景1.1 错误信息分析1.2 问题原因二、解决方法2.1 全局引入 Element

关于@MapperScan和@ComponentScan的使用问题

《关于@MapperScan和@ComponentScan的使用问题》文章介绍了在使用`@MapperScan`和`@ComponentScan`时可能会遇到的包扫描冲突问题,并提供了解决方法,同时,... 目录@MapperScan和@ComponentScan的使用问题报错如下原因解决办法课外拓展总结@

MybatisGenerator文件生成不出对应文件的问题

《MybatisGenerator文件生成不出对应文件的问题》本文介绍了使用MybatisGenerator生成文件时遇到的问题及解决方法,主要步骤包括检查目标表是否存在、是否能连接到数据库、配置生成... 目录MyBATisGenerator 文件生成不出对应文件先在项目结构里引入“targetProje

C#使用HttpClient进行Post请求出现超时问题的解决及优化

《C#使用HttpClient进行Post请求出现超时问题的解决及优化》最近我的控制台程序发现有时候总是出现请求超时等问题,通常好几分钟最多只有3-4个请求,在使用apipost发现并发10个5分钟也... 目录优化结论单例HttpClient连接池耗尽和并发并发异步最终优化后优化结论我直接上优化结论吧,

Java内存泄漏问题的排查、优化与最佳实践

《Java内存泄漏问题的排查、优化与最佳实践》在Java开发中,内存泄漏是一个常见且令人头疼的问题,内存泄漏指的是程序在运行过程中,已经不再使用的对象没有被及时释放,从而导致内存占用不断增加,最终... 目录引言1. 什么是内存泄漏?常见的内存泄漏情况2. 如何排查 Java 中的内存泄漏?2.1 使用 J

python实现pdf转word和excel的示例代码

《python实现pdf转word和excel的示例代码》本文主要介绍了python实现pdf转word和excel的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价... 目录一、引言二、python编程1,PDF转Word2,PDF转Excel三、前端页面效果展示总结一