java題目 HJ70 矩陣乘法計算量估算
阿新 • • 發佈:2022-03-13
描述
矩陣乘法的運算量與矩陣乘法的順序強相關。
例如:
A是一個50×10的矩陣,B是10×20的矩陣,C是20×5的矩陣
計算A*B*C有兩種順序:((AB)C)或者(A(BC)),前者需要計算15000次乘法,後者只需要3500次。
編寫程式計算不同的計算順序需要進行的乘法次數。 資料範圍:矩陣個數:1\le n\le 15 \1≤n≤15 ,行列數:1\le row_i,col_i\le 100\1≤rowi,coli≤100 ,一個括號內有且僅有兩個矩陣。 進階:時間複雜度: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 }