Matrix Chain Multiplication (堆棧)
阿新 • • 發佈:2019-01-31
bool 入棧 code 等於 long ati 比較 pac 次數
題目鏈接:https://vjudge.net/problem/UVA-442
題目大意:輸入n個矩陣的維度和一些矩陣鏈乘表達式,輸出乘法的次數。如果乘法無法進行,輸出error。 假定A是m*n的矩陣,B是n*p的矩陣,乘法次數為m*n*p。如果A的列數不等於B的行數,則乘法
無法進行。
例如A是50*10的,B是10*20的,C是20*5的,則(A(BC))的乘法次數為10*20*5(BC的乘法次數)+50*10*5((A(BC)的乘法次數)=3500
分析:本題的關鍵是解析表達式,本題的表達式比較簡單,可以用一個棧來完成,遇到字母時入棧,遇到右括號時出棧並計算,然後結果入棧。 因為保證輸入合法,括號無需入棧
#include<iostream> #include<stack> #include<algorithm> using namespace std; typedef long long ll; const int maxn=26+5; struct Matrix { int a,b; //Matrix (int a=0,int b=0):a(a),b(b){} Matrix (int c=0,int d=0) { a=c; b=d; } }m[maxn]; stack<Matrix> s; int main() { int n; cin>>n; for(int i=0;i<n;i++) { string name; cin>>name; int k=name[0]-‘A‘;//存下標 cin>>m[k].a>>m[k].b; } string expr; while(cin>>expr) { int len=expr.length(); bool error=false; int ans=0; for(int i=0;i<len;i++) { if(isalpha(expr[i])) s.push(m[expr[i]-‘A‘]);//是否是字母 也就是矩陣 是的話入棧 else if(expr[i]==‘)‘) { Matrix m2=s.top(); s.pop();//取兩個字符 Matrix m1=s.top(); s.pop(); if(m1.b!=m2.a) { error=true; break; } ans+=m1.a*m1.b*m2.b; s.push(Matrix(m1.a,m2.b)); } } if(error) cout<<"error"<<endl; else cout<<ans<<endl; } return 0; }
Matrix Chain Multiplication (堆棧)