日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

30行代码AC——例题6-3 矩阵链乘(Maxtrix Chain Multiplication, UVa 442)——解题报告

發布時間:2024/2/28 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 30行代码AC——例题6-3 矩阵链乘(Maxtrix Chain Multiplication, UVa 442)——解题报告 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

勵志用盡量少的代碼做高效的表達。


題目(提交)鏈接→UVa-442


儲備知識:

矩陣相乘次數:


如圖:A矩陣*B矩陣得到C矩陣。 C矩陣中元素個數=A矩陣行數*B矩陣列數。得到C矩陣中任意元素都需要運算A矩陣的列數次。
因此,總運算次數為:A矩陣行數*B矩陣列數*A矩陣列數(B矩陣行數)=2*2*3=12次。

同理:求A(BC)的運算次數:
設BC矩陣相乘后得D矩陣。
則總次數=BC相乘后的次數+AD相乘后的次數。


思路:

正常的解析表達式類型題直接用字母運算,但本題每個字母對應不同的矩陣。因此本題實質為解析表達式+字符映射矩陣。采用stack<int>s存儲字母(解析表達式);采用map<char, pair<int, int>>m 分別存儲字符、矩陣的行和列(字母映射矩陣)。
實現過程:遍歷輸入序列,若為字母則壓入棧。 若為右括號,則連續彈出兩個棧頂元素做運算, 乘法次數累加至sum中。 本次運算完成后, 建立關于map的新字母映射,存入map(map有去重功能,如果不是新字母映射,會自動刪去), 同時將新字母壓入棧。 繼續遍歷。

注意:

1、棧彈出的順序與輸入的順序相反,判斷行列相等時不要弄反了。
2、因為輸入保證合法,括號無需入棧。

代碼:

#include<bits/stdc++.h> //萬能頭文件 using namespace std; int main() {map<char,pair<int, int> >m;int n; cin >> n; int n1 = n;while(n--) { //構建map映射char ch; cin >> ch; //輸入字母cin >> m[ch].first >> m[ch].second; //輸入矩陣的行、列數} string s; while(cin >> s) { //輸入表達式bool flag = false; //做最后的輸出判斷。stack<int>ss; int len = s.length(), sum = 0; //sum為乘法次數累加for(int i = 0; i < len; i++) { //遍歷表達式if(isalpha(s[i])) ss.push(s[i]); //如果是字母,則壓入棧 else if(s[i] == ')') { //若為右括號,則彈出兩個字母做運算 char b = ss.top(); ss.pop(); char a = ss.top(); ss.pop();if(m[b].first == m[a].second) { //運算過程 sum += m[a].first*m[b].second*m[a].second; //計算乘法次數 m['A'+n1].first = m[a].first; //建立新字母,新映射 m['A'+n1].second = m[b].second; ss.push((char)('A'+n1++)); //新字母入棧 } else { cout << "error\n"; flag = !flag; break; }}}if(!flag) cout << sum << '\n';}return 0; }

收獲:

1、對棧解“解析表達式”更熟練。
2、對map映射運用更加靈活。


擇苦而安,擇做而樂。虛擬現實終究比不過真實精彩之萬一。

總結

以上是生活随笔為你收集整理的30行代码AC——例题6-3 矩阵链乘(Maxtrix Chain Multiplication, UVa 442)——解题报告的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。