例题6-3 矩阵链乘(Matrix Chain Multiplication, UVa 442)

来源:互联网 发布:矩阵音响 编辑:程序博客网 时间:2024/06/06 07:00
#ifdef _DEBUG#pragma warning(disable : 4996)#endif#include <iostream>#include <string>#include <vector>#include <stack>#include <queue>#include <deque>#include <set>#include <map>#include <algorithm>#include <functional>#include <sstream>#include <utility>#include <cstring>#include <cstdio>#include <cstdlib>#include <ctime>#include <cmath>#include <cctype>#define CLEAR(a, b) memset(a, b, sizeof(a))#define CLOSE() ios::sync_with_stdio(false)#define IN() freopen("in.txt", "r", stdin)#define OUT() freopen("out.txt", "w", stdout)#define PF(a) printf("%d\n", a)#define SF(a) scanf("%d", &a)#define SFF(a, b) scanf("%d%d", &a, &b)#define FOR(i, a, b) for(int i = a; i < b; ++i)#define LL long long#define maxn 505#define mod 1000007#define INF 1e15using namespace std;//------------------------------------------------------------------------------------------//typedef pair<int, int> PII;map<char, PII> matrix;int main() {#ifdef _DEBUGIN(); OUT();#endifint n;while (SF(n) == 1) {FOR(i, 0, n) {char ch;cin >> ch;int x, y;SFF(x, y);matrix.insert(make_pair(ch, PII(x, y)));}string s;stack<PII> sta;int ans = 0, ok = 1;while (cin >> s) {ok = 1; ans = 0;FOR(i, 0, s.size()) {if (isalpha(s[i])) {sta.push(matrix[s[i]]);//printf("(%d, %d)\n", sta.top().first, sta.top().second);}if (s[i] == ')') {int c = sta.top().first;int d = sta.top().second; sta.pop();int a = sta.top().first;int b = sta.top().second; sta.pop();//printf("a = %d, b = %d, c = %d, d = %d\n", a, b, c, d);if (b != c) {ok = 0;//printf("b = %d, c = %d\n", b, c);break;}ans += a * b * d;if (sta.empty()) break;sta.push(PII(a, d));}}if (ok) PF(ans);else printf("error\n");}}return 0;}//栈对表达式的作用,遇到字母时入栈,有括号出栈//本题用结构题实现更加清晰

阅读全文
0 0
原创粉丝点击