石子合并问题

本文介绍了一个使用Java实现的算法,旨在解决一个石头游戏问题,通过动态规划计算两个玩家在交替取走石头堆中石头时,如何获得最小或最大得分。算法读取输入文件中的数据,计算并输出最小得分和最大得分。
import java.io.*;
import java.util.Scanner;

public class Problem3_3 {

    public static void main(String [] args) throws IOException {
        File inputfile = new File("input.txt");
        File outputfile= new File("output.txt");
        Scanner input = new Scanner(inputfile);
        PrintWriter output = new PrintWriter(outputfile);
        int sum = input.nextInt();
        int stones [] = new int [sum+1];
        for(int i=1;i<=sum;i++)
            stones[i] = input.nextInt();
        int min = assign_Of_Min(sum,stones);
        System.out.println();
        int max = assign_Of_Max(sum,stones);
        output.println(min);
        System.out.println();
        output.println(max);
        input.close();
        output.close();
        System.out.println("结束");
    }
    public static int assign_Of_Min(int n,int [] arrays) {
        int [][] matrix = new int [n+1][n+1];
        for(int i=1;i<=n;i++)
            matrix[i][i]=arrays[i];
        for(int i=2;i<=n;i++) {
            for(int j=1;j<=n-i+1;j++) {
                int z = i+j-1;
                matrix[j][z] = matrix[j][j]+scores(j,z,j,arrays)+matrix[j+1][z]; //+matrix[j+1][z]+
                int p;
                for(int k=j+1;k<z;k++) {
                    p = scores(j,z,k,arrays)+matrix[j][k]+matrix[k+1][z];//+matrix[k+1][z]
                    if(p<matrix[j][z])
                        matrix[j][z]=p;
                }
            }

        }
        showMatrix(matrix);
        return matrix[1][n];
    }

    public static int assign_Of_Max(int n,int [] arrays) {
        int [][] matrix = new int [n+1][n+1];
        for(int i=1;i<=n;i++)
            matrix[i][i]=arrays[i];
        for(int i=2;i<=n;i++) {
            for(int j=1;j<=n-i+1;j++) {
                int z = i+j-1;
                matrix[j][z] = matrix[j][j]+scores(j,z,j,arrays)+matrix[j+1][z]; //+matrix[j+1][z]+
                int q;
                for(int k=j+1;k<z;k++) {
                    q = scores(j,z,k,arrays)+matrix[j][k]+matrix[k+1][z];//+matrix[k+1][z]
                    if(q>matrix[j][z])
                        matrix[j][z]=q;
                }
            }

        }
        showMatrix(matrix);
        return matrix[1][n];
    }
    public static int scores(int low,int high,int k,int [] scores) {
        if(low<1||high>scores.length-1) {
            System.out.println("you input is wrong");
            return 0;
        }
        else {
            if(low==high)
                return 0;
            else if(low+1==high)
                return 0;
            else {
                 int sumofLeft,sumOfRight;
                 sumofLeft=sumOfRight=0;
                 if(low==k)
                     sumofLeft=0;
                 else{
                     for(int i=low;i<=k;i++) {

                         sumofLeft += scores[i];
                     }
                 }
                 if(k+1==high)
                     sumOfRight=0;
                 else{
                     for(int j=k+1;j<=high;j++){
                         sumOfRight += scores[j];
                     }
                 }
                 return sumOfRight+sumofLeft;
            }

        }

    }
    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();
        }
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值