资源限制
内存限制:256.0MB C/C++时间限制:3.0s Java时间限制:9.0s Python时间限制:15.0s
问题描述
有n个矩阵,大小分别为a0*a1, a1*a2, a2*a3, ..., a[n-1]*a[n],现要将它们依次相乘,只能使用结合率,求最少需要多少次运算。
两个大小分别为p*q和q*r的矩阵相乘时的运算次数计为p*q*r。
输入格式
输入的第一行包含一个整数n,表示矩阵的个数。
第二行包含n+1个数,表示给定的矩阵。
输出格式
输出一个整数,表示最少的运算次数。
样例输入
3
1 10 5 20
样例输出
150
数据规模和约定
1<=n<=1000, 1<=ai<=10000。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scanner=new Scanner(System.in);
int n=scanner.nextInt();
long[] s=new long[n+1];
for(int i=0;i<s.length;i++)
s[i]=scanner.nextInt();
long[][] dp=new long[n+1][n+1];//dp[i][j]表示从第i个矩阵开始一直连乘到第j个矩阵的最小乘积数。
for(int i=1;i<n;i++) {
dp[i][i+1]=s[i-1]*s[i]*s[i+1];
//System.out.println(dp[i][i+1]);
}
for(int k=2;k<n;k++) {
//k+1表示连乘矩阵的长度
for(int i=1;i+k<=n;i++) {
dp[i][i+k]=dp[i][i]+dp[i+1][i+k]+s[i-1]*s[i]*s[i+k];
for(int j=0;j<k;j++) {
dp[i][i+k]=Math.min(dp[i][i+k], dp[i][i+j]+dp[i+j+1][i+k]+s[i-1]*s[i+j]*s[i+k]);
}
}
}
System.out.println(dp[1][n]);
}
}