算法筆記_081:藍橋杯練習 算法提高 矩陣乘法(Java)


目錄

1 問題描述

2 解決方案

 


1 問題描述

問題描述
  有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。

 


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

 

 

 

參考資料:

1. 【藍橋】算法提高 矩陣乘法

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM