E题题解

正常的区间DP,dp[i][j]表示[i,j]这个区间的划分的最小乘积,然后枚举k转移,这里需要判断i和j中间点的个数,是不是符合三角形的规则。然后由于数据比较大,1e9^3,所以用JAVA来一发基本ok。

import java.math.BigInteger;
import java.util.Scanner;
public class Main{
    public static void main(String[] args) {
        Scanner cin=new Scanner(System.in);
        while(cin.hasNext()){
            int n=cin.nextInt();
            BigInteger []a=new BigInteger[n+10];
            BigInteger[][]dp=new BigInteger[100][100];
            for(int i=1;i<=n;i++){
                a[i]=cin.nextBigInteger();
            }
            for(int i=0;i<100;i++){
                for(int j=0;j<100;j++){
                    dp[i][j]=new BigInteger("134567456745674567567567567134567456745674567567567567");
                }
            }
            for(int i=n;i>=1;i--){
                for(int j=i+1;j<=n;j++){
                    if(j-i==1){
                        dp[i][j]=BigInteger.ZERO;
                    }
                    else if(j-i==2){
                        dp[i][j]=a[i].multiply(a[i+1].multiply(a[i+2]));
                    }else{
                        for(int k=i+1;k<=j-1;k++){
                            BigInteger pre=dp[i][k].add(dp[k][j].add(a[i].multiply(a[j].multiply(a[k]))));
                            if(dp[i][j].compareTo(pre)==1){
                                dp[i][j]=pre;
                            }
                        }
                    }
                }
            }
            System.out.println(dp[1][n]);
        }
    }
}