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
今日推荐
周排行