1. 程式人生 > >【華為機試070】矩陣乘法計算量估算

【華為機試070】矩陣乘法計算量估算

題目描述:

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


例如:

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

知識點:

  • 棧裡存放的是每個矩陣的行數和列數