计算机算法分析与设计(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

相关文章

MySQL中的LENGTH()函数用法详解与实例分析

《MySQL中的LENGTH()函数用法详解与实例分析》MySQLLENGTH()函数用于计算字符串的字节长度,区别于CHAR_LENGTH()的字符长度,适用于多字节字符集(如UTF-8)的数据验证... 目录1. LENGTH()函数的基本语法2. LENGTH()函数的返回值2.1 示例1:计算字符串

Android kotlin中 Channel 和 Flow 的区别和选择使用场景分析

《Androidkotlin中Channel和Flow的区别和选择使用场景分析》Kotlin协程中,Flow是冷数据流,按需触发,适合响应式数据处理;Channel是热数据流,持续发送,支持... 目录一、基本概念界定FlowChannel二、核心特性对比数据生产触发条件生产与消费的关系背压处理机制生命周期

c++ 类成员变量默认初始值的实现

《c++类成员变量默认初始值的实现》本文主要介绍了c++类成员变量默认初始值,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录C++类成员变量初始化c++类的变量的初始化在C++中,如果使用类成员变量时未给定其初始值,那么它将被

C++中NULL与nullptr的区别小结

《C++中NULL与nullptr的区别小结》本文介绍了C++编程中NULL与nullptr的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编... 目录C++98空值——NULLC++11空值——nullptr区别对比示例 C++98空值——NUL

C++ Log4cpp跨平台日志库的使用小结

《C++Log4cpp跨平台日志库的使用小结》Log4cpp是c++类库,本文详细介绍了C++日志库log4cpp的使用方法,及设置日志输出格式和优先级,具有一定的参考价值,感兴趣的可以了解一下... 目录一、介绍1. log4cpp的日志方式2.设置日志输出的格式3. 设置日志的输出优先级二、Window

怎样通过分析GC日志来定位Java进程的内存问题

《怎样通过分析GC日志来定位Java进程的内存问题》:本文主要介绍怎样通过分析GC日志来定位Java进程的内存问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、GC 日志基础配置1. 启用详细 GC 日志2. 不同收集器的日志格式二、关键指标与分析维度1.

Java 线程安全与 volatile与单例模式问题及解决方案

《Java线程安全与volatile与单例模式问题及解决方案》文章主要讲解线程安全问题的五个成因(调度随机、变量修改、非原子操作、内存可见性、指令重排序)及解决方案,强调使用volatile关键字... 目录什么是线程安全线程安全问题的产生与解决方案线程的调度是随机的多个线程对同一个变量进行修改线程的修改操

Java中的雪花算法Snowflake解析与实践技巧

《Java中的雪花算法Snowflake解析与实践技巧》本文解析了雪花算法的原理、Java实现及生产实践,涵盖ID结构、位运算技巧、时钟回拨处理、WorkerId分配等关键点,并探讨了百度UidGen... 目录一、雪花算法核心原理1.1 算法起源1.2 ID结构详解1.3 核心特性二、Java实现解析2.

从入门到精通C++11 <chrono> 库特性

《从入门到精通C++11<chrono>库特性》chrono库是C++11中一个非常强大和实用的库,它为时间处理提供了丰富的功能和类型安全的接口,通过本文的介绍,我们了解了chrono库的基本概念... 目录一、引言1.1 为什么需要<chrono>库1.2<chrono>库的基本概念二、时间段(Durat

Redis出现中文乱码的问题及解决

《Redis出现中文乱码的问题及解决》:本文主要介绍Redis出现中文乱码的问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. 问题的产生2China编程. 问题的解决redihttp://www.chinasem.cns数据进制问题的解决中文乱码问题解决总结