算法设计与分析 - 游艇租用问题 (java实现)

题目描述:

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

输入:
第一行中有一个正整数n(n,=200),表示有n个游艇出租站。接下来的n-1行是r(i,j),1<=i,i<=n。

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

样例1输入:
 

3
5 15
7

样例1输出:
 

12

样例二:从boat.txt文件读入数据,文件内容如下

37
18 5 9 8 8 36 74 24 18 42 37 110 46 138 160 29 12 75 103 15 215 229 59 226 12 13 204 144 290 282 124 279 154 305 291 201 
9 16 9 26 16 47 61 15 35 74 107 47 64 149 139 1 96 105 188 39 100 144 60 147 220 70 204 213 85 71 244 67 252 342 303 
6 30 23 31 10 64 29 76 78 85 11 45 7 82 138 33 130 37 25 71 179 173 102 66 49 187 128 17 272 124 189 130 163 78 
14 14 1 14 10 67 60 19 59 88 49 109 38 23 48 107 25 154 54 6 126 126 49 40 199 4 185 233 189 11 149 230 160 
3 15 38 44 20 13 30 27 49 61 10 16 125 80 84 70 13 133 43 45 1 219 186 81 205 41 23 134 200 170 73 154 
13 19 27 6 16 25 28 81 5 3 6 16 118 60 3 128 91 101 15 127 39 227 202 117 166 140 88 132 103 146 26 
4 25 21 16 16 30 80 9 7 83 85 57 87 147 38 150 130 105 10 85 207 181 26 122 48 32 209 160 61 162 
10 30 1 26 49 27 8 43 7 67 22 64 73 115 150 18 5 118 70 13 51 55 35 204 158 111 98 212 169 
19 25 37 39 11 48 7 86 32 2 22 3 82 104 33 61 109 105 125 151 1 212 143 110 120 43 216 90 
10 3 5 24 24 4 50 15 26 61 41 106 79 61 126 65 20 190 71 71 202 147 51 20 13 43 199 
2 13 37 24 53 23 43 31 7 16 83 27 19 97 94 128 36 136 15 53 209 219 58 98 124 78 
17 1 39 40 38 15 65 87 90 69 25 43 87 41 152 78 77 41 137 33 133 117 122 158 84 
16 26 21 12 45 63 43 54 31 76 99 43 24 43 135 23 147 40 118 166 18 137 61 238 
18 26 9 1 23 37 73 90 15 77 46 130 18 108 81 98 173 150 144 138 195 188 124 
20 3 25 28 2 31 71 10 92 56 55 16 116 62 91 154 20 177 125 145 76 30 
2 19 2 43 40 57 72 32 45 86 105 79 72 26 5 85 62 87 195 47 102 
6 13 16 49 11 6 11 21 81 31 51 71 139 146 149 41 57 38 110 90 
15 15 35 29 12 46 79 32 99 75 13 106 61 96 12 117 83 156 46 
9 12 36 30 19 25 5 1 78 93 88 101 18 17 47 142 54 30 
15 13 19 9 23 64 2 70 5 50 27 74 12 38 26 13 66 
17 27 2 5 32 42 53 66 50 7 114 47 40 61 143 111 
20 21 22 29 59 16 27 2 43 68 34 58 38 12 12 
14 8 6 35 41 59 70 32 94 84 106 52 49 37 
7 24 16 12 51 43 41 81 86 33 51 1 107 
6 16 17 49 16 10 4 6 21 74 96 32 
4 8 31 16 18 56 62 87 54 29 92 
11 30 35 18 53 3 12 12 86 64 
16 14 23 14 12 11 35 89 10 
15 25 33 34 18 65 4 75 
13 29 33 30 5 10 51 
6 5 38 41 57 63 
17 24 8 24 18 
14 14 4 42 
16 19 6 
15 16 
1 

 Output2:

15

思路:用数组dp[i][j]表示从出租站i到j所用最少费用。

Tips:C语言从文件读入数据:

#include 
int main(int argc, char const *argv[])
{
#ifndef ONLINE_JUDGE
freopen("input.txt", "r", stdin);
#endif
int n;
while (scanf("%d", &n) != EOF)
{
printf("%d\n", n);
}
return 0;
}

 java从文件读入数据:

import java.io.*;
import java.util.*;
public class Main{
	public static void main(String args[]){
	
		Scanner cin = new Scanner(System.in);
		try{cin=new Scanner(new FileInputStream("data.in"));}catch(Exception e){}
		int a, b;
		while (cin.hasNext()){
			a = cin.nextInt(); b = cin.nextInt();
			System.out.println(a + b);
		}
	}
}

 

C++实现:

#include 
#include 
using namespace std;
int main()
{
        int dp[100][100];
        int i, j, k, p;
        int n;
        while (cin >> n)
        {
                for (i = 1; i < n; i++)
                {
                        for (j = i+1; j <=n; j++)
                        {
                                cin >> dp[i][j];
                        }
                }
                for (k = 2; k < n; k++)
                {
                        for (i = 1; i <= n - k;i++)
                        {
                                j = i + k;
                                for (p = i + 1; p < j; p++)
                                {
                                        int s = dp[i][p] + dp[p][j];
                                        if (dp[i][j]>s)
                                                dp[i][j] = s;
                                }
                        }
                }
                printf("%d\n", dp[1][n]);
        }
        return 0;
}

java实现:

算法设计与分析 - 游艇租用问题 (java实现)_第1张图片


import java.io.FileInputStream;
import java.util.Scanner;

public class boat2 {
	
	public static void main(String[] args){
        Scanner input = new Scanner(System.in);
        int n;
        int[][] fee;
        try{
			input=new Scanner(new FileInputStream("boat.txt"));
			}catch(Exception e){
				
			}
        while (input.hasNext()){
            n = input.nextInt();
            fee = new int[n][n];

            for(int row=0; row tmp)
                            fee[i][j] = tmp;
                    }
                }

            System.out.println(fee[0][n-1]);
            //fee[i][j]: 从第i个出租站到第j个出租站所需的最少租金,可见fee[0][n-1]即为所求
        }
    }


}

 

算法设计与分析 - 游艇租用问题 (java实现)_第2张图片

 

参考文章;https://www.zhihu.com/question/24731236?sort=created

https://blog.csdn.net/IOIO_/article/details/81017582

 

你可能感兴趣的:(ACM,算法设计与分析,游艇租用问题,java,动态规划,游艇租用问题,java)