目錄
1 問題描述
問題描述
有n個矩陣,大小分別為a0*a1, a1*a2, a2*a3, ..., a[n-1]*a[n],現要將它們依次相乘,只能使用結合率,求最少需要多少次運算。
兩個大小分別為p*q和q*r的矩陣相乘時的運算次數計為p*q*r。
兩個大小分別為p*q和q*r的矩陣相乘時的運算次數計為p*q*r。
輸入格式
輸入的第一行包含一個整數n,表示矩陣的個數。
第二行包含n+1個數,表示給定的矩陣。
第二行包含n+1個數,表示給定的矩陣。
輸出格式
輸出一個整數,表示最少的運算次數。
樣例輸入
3
1 10 5 20
1 10 5 20
樣例輸出
150
數據規模和約定
1<=n<=1000, 1<=ai<=10000。
2 解決方案
首先說一下這題解題思路(PS:主要考查動態規划法思想):
引用文末參考資料1中配圖(詳情講解請參考參考資料1哦):
下面代碼在系統中評分為70分,不過我用參考資料1中的代碼在系統中測評為100分。下面代碼僅供參考~
具體代碼如下:
import java.util.Scanner; public class Main { public void printResult(int[] arrayMatrix) { int length = arrayMatrix.length; //有length個數,可知有length - 1個矩陣 long[][] dp = new long[length][length]; //dp[0][i]和dp[i][0]均為0,無意義 long sum; for(int len = 2;len < length;len++) { //依次計算len個矩陣相乘的最小結果,即dp[1][len] for(int i = 1, j = len;j < length;i++, j++) { //此層循環用於計算dp[i][j]值,即矩陣中對角線的元素值 long min = Long.MAX_VALUE; for(int k = i;k < j;k++) { //此層循環,用於找到dp[i][j]的最小值 sum = dp[i][k] + dp[k + 1][j] + arrayMatrix[i - 1] * arrayMatrix[k] * arrayMatrix[j]; if(min > sum) min = sum; } dp[i][j] = min; } } //輸出最終結果 System.out.println(dp[1][length - 1]); return; } public static void main(String[] args) { Main test = new Main(); Scanner in = new Scanner(System.in); int n = in.nextInt(); if(n <= 1 || n > 1000) return; int[] arrayMatrix = new int[n + 1]; for(int i = 0;i <= n;i++) arrayMatrix[i] = in.nextInt(); test.printResult(arrayMatrix); } }
參考資料: