首页 > 其他分享 >租用游艇问题

租用游艇问题

时间:2023-11-25 23:44:40浏览次数:26  
标签:12 min int 游艇 问题 循环 租用

租用游艇问题

如题:

思路:

类似于矩阵连乘问题

从第i站到第j站时,我们可以从这两个站中间选择一个中间站k,先从始发站i坐从中间站k下船后,再从第k站坐船到第j站,这样就把一个大问题m[i][i]划分成了m[i][k]和m[k][j]两个子问题。

m[i][j]可以定义为

i+1==j, m[i][j]

i+1<j, min{ min(m[i][k]+m[k][j]), m[i][j] }

举例说明,

上站 下站 租金
1 2 5
1 3 15
1 4 21
2 3 7
2 4 14
3 4 8

m[i][j]

m(1,1)=0 m(1,2)=5 m(1,3)=min{m(1,2) +m(2,3), m(1,3)}=12 m(1,4)=min{m(1,2) +m(2,3) +m(3+4), m(1,4) }=20
m(2,2)=0 m(2,3)=7 m(2,4)=min{m(2,3) +m(3,4), m(2,4)}=14
m(3,3)=0 m(3,4)=8
m(4,4)=0
    for(int i = n; i >=1; i--){

        for(int j = i+1; j <= n; j++){

            for(int k = i+1; k < j; k++){

                int temp = m[i][k] + m[k][j];

                if(temp < m[i][j]){
                    m[i][j] = temp;
                }
            }
        }
    }
  • 第一次循环:i=3j=4,不满足 j<= n=3 的条件,退出内层循环。

  • 第二次循环:i=2j=1,不满足 j>=i+1 的条件,退出内层循环。

  • 第三次循环:

     i=1, j=3, k=2
    

    temp = m[1][2] + m[2][3] = 5 + 7 = 12

    temp 小于 m[1][3] 的初始值 15,所以 m[1][3] 的值被更新为 12。

代码:

#include<stdio.h>

void calculateMinRent(int n, int m[100][100]){

    //初始化
    for(int i = 0; i < n; i++){
        m[i][i] = 0;
    }

    //输入各个站点之间的租金
    for(int i = 1; i <= n; i++){

        // i 站点的下一个站点 i+1 
        for(int j = i+1; j <= n; j++){

            scanf("%d", &m[i][j]);
        }
    }

    //遍历矩阵的上半部分
    //最外层循环从最后一站往前 控制行 (起始站点)
    //第二层循环从当前站点往后 控制列 (当前站点的下一站点到终点站)
    //第三次循环,划分区间,计算租金
    for(int i = n; i >=1; i--){

        for(int j = i+1; j <= n; j++){

            for(int k = i+1; k < j; k++){

                int temp = m[i][k] + m[k][j];

                if(temp < m[i][j]){
                    m[i][j] = temp;
                }
            }
        }
    }

    printf("%d\n", m[1][n]);

}

int main(){

    int m[100][100];
    int n;

    scanf("%d", &n);

    calculateMinRent(n,m);

    return 0;

}

标签:12,min,int,游艇,问题,循环,租用
From: https://www.cnblogs.com/kirei7/p/17856357.html

相关文章

  • 【笔记】kth - 浅谈前 k 优解问题
    【笔记】kth-浅谈前k优解问题第一次见到这一类的trick是在SDOI2013-淘金,现在才知道这个trick还有一堆扩展。Part0.这类问题的一个通用思路:对于目前考虑到的一个状态\(S\),设\(\operatorname{trans}(S)\)为\(S\)的后继状态集合。首先将最优的状态\(S\)放入......
  • P1029 最大公约数和最小公倍数问题(普及−) 题解
    题目传送门想要做这题,我们要先了解一下最大公约数。最大公因数,也称最大公约数、最大公因子,指两个或多个整数共有约数中最大的一个。a,b的最大公约数记为(a,b),同样的,a,b,c的最大公约数记为(a,b,c),多个整数的最大公约数也有同样的记号。求最大公约数有多种方法,常见的有质因数分解法、短......
  • Win10无法访问linux上的samba服务问题解决
    转自https://blog.csdn.net/u014635079/article/details/124703840服务端:Ubuntu20.04, samba版本4.13.17-Ubuntu客户端:Win10 问题1:按照教程搭建好samba服务之后,从windows可以ping通linux的情况下,从windows端无法连接samba服务器。 解决:通过打开Lanman工作站的启用不......
  • SAP UI5 控件双向数据绑定后显示数据出问题,可以调试这个方法
    在ClientPropertyBinding构造函数里调试_getValue方法。在ClientPropertyBinding的实现中,_getValue方法起着关键的作用。这个方法的主要任务是从模型中获取数据,并将其返回,以便在视图中使用。为了理解_getValue方法的详细工作,我们可以将其分解为以下几个步骤:查找模型......
  • 面向对象软件设计中常见的问题 - 为什么要定义类的私有方法
    "为什么要定义私有方法?"这是一个在面向对象软件设计中常见的问题,涉及到封装性、安全性和设计灵活性等方面的考虑。首先,让我们来看看为什么要使用私有方法。封装性(Encapsulation):面向对象编程的一个基本原则是封装,即将对象的内部细节隐藏起来,只暴露必要的接口给外部。私有方法是......
  • #P1033. 迷宫问题
    题意是:给你一个迷宫,起点为S,终点为T,.表示空格,#表示障碍物无法通过,你每次可以从当前位置上下左右移动(不能出界或者撞到障碍物上)你需要找出从起点到终点的最少步数,如果不存在解,输出-1。BFS的练手题usingnamespacestd;intsx,sy,ex,ey;intn,m;intdx[4]={0,0,1,-1};intdy[4......
  • 中伟视界:AI盒子智能分析算法解决油气管道长无人场景下的人车监测问题
        在油气管道长又无人的场景下,人和车的监测问题一直是一个难题。传统的监测手段往往存在盲区和误报问题,给管道运行安全带来了一定的隐患。然而,随着人工智能技术的不断发展,利用AI盒子的智能分析算法可以有效解决这一问题。AI盒子可以通过视频监控系统实时检测管道周边的人......
  • Java 中如何解决跨域问题
    文章目录背景一、什么是跨域?为什么会出现跨域二、Java实现跨域方式2.1、返回新的CorsFilter(全局跨域)2.2、重写WebMvcConfigurer(全局跨域)2.3、使用注解(aa局部跨域)2.4、手动设置响应头(局部跨域)2.5、使用自定义filter实现跨域2.6、SpringCloudGateway跨域配......
  • 项目启动遇到的问题
    java:无法访问org.springframework.boot.SpringApplication错误的类文件:/D:/Repository/org/springframework/boot/spring-boot/3.0.5/spring-boot-3.0.5.jar!/org/springframework/boot/SpringApplication.class类文件具有错误的版本61.0,应为52.0请删除该文件......
  • set集合的线程安全问题
    一、HashSetHashSet是基于HashMap实现的,因为HashMap本身是线程不安全的,所以HashMap就是线程不安全的,简单看下HashSet的源码publicclassHashSet<E>extendsAbstractSet<E>implementsSet<E>,Cloneable,java.io.Serializable{staticfinallongserialVersio......