船艇租用问题

package com.company;
import java.util.Scanner;
import java.io.*;
public class Probem3_ {
    static int n;
    static int [][] sample;
    static int [][] F;
    static File inputfile = new File("input.txt");
    static File outputfile = new File("output.txt");
    static Scanner input;                                              //用Scanner来读取数据
    static PrintWriter output;                                         //用PrintWriter来写数据
    private static void FileOperate(File file1,File file2)throws FileNotFoundException,IOException{
        input = new Scanner(file1);
        output= new PrintWriter(file2);
        n = input.nextInt();
        sample = new int[n][n+1];
        F = new int [n][n+1];
        for(int i=1;i<=n-1;i++){                                       //站点1到n-1
            for(int j=i+1;j<=n;j++)                                  //从第i个站点到n-1站点
                sample[i][j] = input.nextInt();
        }
    }
    public static void main(String [] args )throws FileNotFoundException,IOException{
        FileOperate(inputfile,outputfile);
        output.println(Assign());
        input.close();
        output.close();
        showMatrix(sample);
        System.out.println();
        showMatrix(F);
    }

    public static void showMatrix(int [][] array){
        for(int i=1;i<array.length;i++){
            for(int j=1;j<array[i].length;j++)
                System.out.printf("%-2d  ",array[i][j]);
            System.out.println();
        }
    }

    /*****************************************************************************
     * F[i][j]表示从站i到站j所需要的最少费用,则
     * 最优子结构:F[i][j] = min{sample[i][j],min(sample[i][k]+sample[k][j])}  k>=i+1 and k<=j-1
     * 重复子问题:大问题会用到子问题的最优解
     **************************************************************************/
    public static int Assign(){
        for(int i=1;i<n;i++){
            F[i][i] = 0;
        }
        for(int i=2;i<=n;i++){
            for(int j=1;j<=n-i+1;j++){
                int z = j+i-1;
                int mintemp = sample[j][z];
                F[j][z] = sample[j][z];
                for(int k=j+1;k<z;k++){
                    if(F[j][k]+F[k][z]<mintemp){
                        F[j][z] = F[j][k]+F[k][z];
                    }
                }

            }
        }
        return F[1][n];
    }


}

猜你喜欢

转载自blog.csdn.net/qq_37663299/article/details/83626796