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

相关文章

解决IDEA报错:编码GBK的不可映射字符问题

《解决IDEA报错:编码GBK的不可映射字符问题》:本文主要介绍解决IDEA报错:编码GBK的不可映射字符问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录IDEA报错:编码GBK的不可映射字符终端软件问题描述原因分析解决方案方法1:将命令改为方法2:右下jav

C#如何调用C++库

《C#如何调用C++库》:本文主要介绍C#如何调用C++库方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录方法一:使用P/Invoke1. 导出C++函数2. 定义P/Invoke签名3. 调用C++函数方法二:使用C++/CLI作为桥接1. 创建C++/CL

MyBatis模糊查询报错:ParserException: not supported.pos 问题解决

《MyBatis模糊查询报错:ParserException:notsupported.pos问题解决》本文主要介绍了MyBatis模糊查询报错:ParserException:notsuppo... 目录问题描述问题根源错误SQL解析逻辑深层原因分析三种解决方案方案一:使用CONCAT函数(推荐)方案二:

Python中的Walrus运算符分析示例详解

《Python中的Walrus运算符分析示例详解》Python中的Walrus运算符(:=)是Python3.8引入的一个新特性,允许在表达式中同时赋值和返回值,它的核心作用是减少重复计算,提升代码简... 目录1. 在循环中避免重复计算2. 在条件判断中同时赋值变量3. 在列表推导式或字典推导式中简化逻辑

Redis 热 key 和大 key 问题小结

《Redis热key和大key问题小结》:本文主要介绍Redis热key和大key问题小结,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录一、什么是 Redis 热 key?热 key(Hot Key)定义: 热 key 常见表现:热 key 的风险:二、

IntelliJ IDEA 中配置 Spring MVC 环境的详细步骤及问题解决

《IntelliJIDEA中配置SpringMVC环境的详细步骤及问题解决》:本文主要介绍IntelliJIDEA中配置SpringMVC环境的详细步骤及问题解决,本文分步骤结合实例给大... 目录步骤 1:创建 Maven Web 项目步骤 2:添加 Spring MVC 依赖1、保存后执行2、将新的依赖

Spring 中的循环引用问题解决方法

《Spring中的循环引用问题解决方法》:本文主要介绍Spring中的循环引用问题解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录什么是循环引用?循环依赖三级缓存解决循环依赖二级缓存三级缓存本章来聊聊Spring 中的循环引用问题该如何解决。这里聊

Spring Boot中JSON数值溢出问题从报错到优雅解决办法

《SpringBoot中JSON数值溢出问题从报错到优雅解决办法》:本文主要介绍SpringBoot中JSON数值溢出问题从报错到优雅的解决办法,通过修改字段类型为Long、添加全局异常处理和... 目录一、问题背景:为什么我的接口突然报错了?二、为什么会发生这个错误?1. Java 数据类型的“容量”限制

利用Python调试串口的示例代码

《利用Python调试串口的示例代码》在嵌入式开发、物联网设备调试过程中,串口通信是最基础的调试手段本文将带你用Python+ttkbootstrap打造一款高颜值、多功能的串口调试助手,需要的可以了... 目录概述:为什么需要专业的串口调试工具项目架构设计1.1 技术栈选型1.2 关键类说明1.3 线程模

关于MongoDB图片URL存储异常问题以及解决

《关于MongoDB图片URL存储异常问题以及解决》:本文主要介绍关于MongoDB图片URL存储异常问题以及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录MongoDB图片URL存储异常问题项目场景问题描述原因分析解决方案预防措施js总结MongoDB图