zoukankan      html  css  js  c++  java
  • 【洛谷】P1359 租用游艇

    题目描述

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

    输入格式

    第一行中有一个正整数 n,表示有 n 个游艇出租站。接下来的 n−1行是一个半矩阵 r(i,j)(1≤i<j≤n)。

    输出格式

    输出计算出的从游艇出租站 1 到游艇出租站 n 所需的最少租金。

    输入输出样例

    输入 #1
    3
    5 15
    7

    输出 #1
    12

    说明/提示

    n≤200,保证计算过程中任何时刻数值都不超过 10^6。


    设 map[i][j] 表示从游艇出租站 i 到游艇出租站 j 之间的最少租金 那么从游艇出租站 i 到游艇出租站 j 有两种情况:
    1.直接过去(输入时的 map[i][j])
    2.从游艇出租站i到游艇出租站 x(中转站)再从游艇出租站 x 到游艇出租 j

    那么第二种情况就变成两个子问题: map[i][x]+map[x][j]

    最终答案就是map[1][n]

    #include<iostream>
    using namespace std;
    
    const int N = 200 + 10;
    int n;
    int map[N][N];
    
    int main()
    {
    	cin >> n;
    	for(int i = 1; i <= n; i++)
    	{
    		for(int j = i +1; j <= n; j++)
    		{
    			cin >> map[i][j];
    		}
    	}
    	
    	for(int i = 1; i <= n; i++)								//出发地点为 i,枚举每一个出发地点 
    	{
    		for(int j = i + 1; j <= n; j++)						//目的地点为 j,枚举每一个 i 后面的目的地点 
    		{	
    			for(int k = i + 1; k < j; k++)					//枚举每一个中转站 k 
    			{
    				map[i][j] = min(map[i][j], map[i][k] + map[k][j]);	//得到 任何 i 到 j 的最少租金( i < j) 
    			}
    		}
    	}
    	
    	cout << map[1][n];										//输出从 1 到 n 的最少租金 
    	
    	return 0;
     }
  • 相关阅读:
    MQTT简单demo(java)
    MQTT协议开发心得
    浏览器播放RTSP格式视频流的解决方法
    JSON学习
    Redis安装和java代码实现增删改查
    创建一个简单的SpringMVC框架
    oracle创建只读权限的用户简单四步走(创建用户/赋连接权限/赋表权限/创建同义词)
    html读取图片
    ORACLE多表关联UPDATE 语句
    Oracle 闪回查询
  • 原文地址:https://www.cnblogs.com/go-alltheway/p/14652233.html
Copyright © 2011-2022 走看看