1. 程式人生 > 其它 >java題目 HJ70 矩陣乘法計算量估算

java題目 HJ70 矩陣乘法計算量估算

描述

矩陣乘法的運算量與矩陣乘法的順序強相關。
例如:

A是一個50×10的矩陣,B是10×20的矩陣,C是20×5的矩陣

計算A*B*C有兩種順序:((AB)C)或者(A(BC)),前者需要計算15000次乘法,後者只需要3500次。

編寫程式計算不同的計算順序需要進行的乘法次數。   資料範圍:矩陣個數:1\le n\le 15 \1n15 ,行列數:1\le row_i,col_i\le 100\1rowi,coli100 ,一個括號內有且僅有兩個矩陣。 進階:時間複雜度:O(n)\O(n) ,空間複雜度:O(n)\O(n) 

 

輸入描述:

輸入多行,先輸入要計算乘法的矩陣個數n,每個矩陣的行數,列數,總共2n的數,最後輸入要計算的法則
計算的法則為一個字串,僅由左右括號和大寫字母('A'~'Z')組成,保證括號是匹配的且輸入合法!

輸出描述:

輸出需要進行的乘法次數

示例1

輸入:
3
50 10
10 20
20 5
(A(BC))
輸出:
3500

 

 

 1 import java.util.*;
 2 
 3 public class Main {
 4     public static void main(String[] args) {
 5         Scanner sc = new Scanner(System.in);
 6         
 7         while(sc.hasNext()) {
 8             int n = sc.nextInt();
9 int[][] input = new int[n][2]; 10 for(int i=0; i<n; i++) { 11 for(int j=0; j<2; j++) { 12 input[i][j] = sc.nextInt(); 13 } 14 } 15 //輸入規則 16 String rule = sc.next(); 17 System.out.println(caculate(input, rule));
18 } 19 } 20 21 public static int caculate(int[][] dp, String rule) { 22 int res =0; 23 24 //解析規則,雙棧法:一個棧用來存括號,另一個用來存矩陣中的行 25 Stack<int[]> stack1 = new Stack<>(); //存放矩陣行 26 Stack<Character> stack2 = new Stack<>(); //存括號 27 28 for(int i=0; i<rule.length(); i++) { 29 char c = rule.charAt(i); 30 if(c >= 'A' && c <= 'Z') { 31 stack1.push(dp[c-'A']); 32 }else if(c == '(') { //左括號 33 stack2.push(c); 34 }else if(c == ')' && !stack2.isEmpty()) { 35 stack2.pop(); 36 //右括號且stack2中還有(,彈出stack1中行,並且遵循後入先出的規則 37 //以(A(BC))為例,則先彈出的是C,後彈出的是B 38 int[] n2 = stack1.pop(); //C(20,5) 39 int[] n1 = stack1.pop(); //B(10,20) 40 //更新結果 41 res = res + n1[0] * n1[1] * n2[1]; 42 //將BC得到的結果新增到stack1中 43 int[] tem = {n1[0],n2[1]}; 44 stack1.push(tem); //BC(10,5) 45 } 46 } 47 return res; 48 } 49 }