【華為機試070】矩陣乘法計算量估算
阿新 • • 發佈:2018-12-24
題目描述:
矩陣乘法的運算量與矩陣乘法的順序強相關。
例如:
A是一個50×10的矩陣,B是10×20的矩陣,C是20×5的矩陣
計算A*B*C有兩種順序:((AB)C)或者(A(BC)),前者需要計算15000次乘法,後者只需要3500次。
編寫程式計算不同的計算順序需要進行的乘法次數
Java實現:
import java.util.Scanner; import java.util.Stack; public class Main{ public static void main(String[] args) { Scanner scanner=new Scanner(System.in); while (scanner.hasNext()) { String nStr=scanner.nextLine(); int n=Integer.parseInt(nStr); int[][] matrix=new int[n][2]; for (int i = 0; i < n; i++) { String str=scanner.nextLine(); String[] tmpArray=str.split(" "); matrix[i][0]=Integer.parseInt(tmpArray[0]); matrix[i][1]=Integer.parseInt(tmpArray[1]); } String expression=scanner.nextLine(); int result=calculateMutiplyCount(matrix,expression); System.out.println(result); } scanner.close(); } public static int calculateMutiplyCount(int[][] matrix, String expression) { int result=0; Stack<Integer> stack=new Stack<Integer>(); int index=0; for (int i = 0; i < expression.length(); i++) { char item=expression.charAt(i); if (Character.isLetter(item)) { if (!stack.isEmpty()&&stack.peek()!=-1) { int col=stack.pop(); int row=stack.pop(); int col2=matrix[index][1]; result+=row*col*col2; stack.push(row); stack.push(col2); }else { stack.push(matrix[index][0]); stack.push(matrix[index][1]); } index++; }else if (item=='(') { stack.push(-1); }else if (item==')') { int col1=stack.pop(); int row1=stack.pop(); stack.pop(); if (stack.size()<=1) { return result; } if (stack.peek()!=-1) { stack.pop(); int row2=stack.pop(); result+=row2*row1*col1; row1=row2; } stack.push(row1); stack.push(col1); } } return result; } }
知識點:
- 棧裡存放的是每個矩陣的行數和列數