Matrix multiplication problem is a typical example of dynamical programming.
Suppose you have to evaluate an expression like A*B*C*D*E where A,B,C,D and E are matrices. Since matrix multiplication is associative, the order in which multiplications are performed is arbitrary. However, the number of elementary multiplications needed strongly depends on the evaluation order you choose. For example, let A be a 50*10 matrix, B a 10*20 matrix and C a 20*5 matrix. There are two different strategies to compute A*B*C, namely (A*B)*C and A*(B*C). The first one takes 15000 elementary multiplications, but the second one only 3500.
Your job is to write a program that determines the number of elementary multiplications needed for a given evaluation strategy.
15125
import java.io.BufferedInputStream; import java.io.PrintWriter; import java.util.HashMap; import java.util.Map; import java.util.Scanner; import java.util.Stack; public class Main { public static void main(String[] args) { new Task().solve(); } } class Task { Scanner in = new Scanner(new BufferedInputStream(System.in)) ; PrintWriter out = new PrintWriter(System.out); class Node{ long row , col ; Node(long row , long col){ this.row = row ; this.col = col ; } } Map<Character , Node> hash = new HashMap<Character, Task.Node>() ; String calc(String expre){ Stack<Node> stk = new Stack<Node>() ; long sum = 0 ; for(char c : expre.toCharArray()){ if(')' == c){ if(stk.size() < 3){ return "error" ; } Node right = stk.pop() ; Node left = stk.pop() ; if(left.row == -1 || right.row == -1 || left.col != right.row){ return "error" ; } sum += left.row * left.col * right.col ; if(stk.pop().row != -1){ return "error" ; } stk.push(new Node(left.row , right.col)) ; } else{ Node node = hash.get(c) ; if(node == null){ return "error" ; } stk.push(node) ; } } if(stk.size() == 1 && stk.pop().row != -1){ return String.valueOf(sum) ; } return "error" ; } void solve() { hash.clear() ; hash.put('(' , new Node(-1, -1)) ; int n = in.nextInt() ; while(n-- > 0){ hash.put(in.next().charAt(0), new Node(in.nextLong(), in.nextLong())) ; } while(in.hasNext()){ out.println(calc(in.next())) ; //out.flush(); } out.flush(); } }