题目:442 - Matrix Chain Multiplication
题目大意:求矩阵相乘需要的加法步数。
解题思路:将给出的式子,一个一个字符的放到栈中,当遇到右括号,就从栈中退出两个矩阵,和一个左括号。判断这两个举阵能不能相乘,(前一个的列等于后一个的行)再将这个矩阵入栈,之后遇到右括号再出栈,一直到式子末尾就结束。最后要将栈清空,为了下一次计算做准备。
还要注意特殊情况:就是没有括号的式子,单独考虑。
#include<stdio.h>
#include<string.h>
#include<stack>
using namespace std;
const int N = 30;
int n;
struct dight {
char name;
int s[2];
} t[N], m;
stack <dight> st;
//用来收索对应矩阵
int search(char ch1) {
int i;
for(i = 0; i < n + 1 ; i++)
if(t[i].name == ch1)
break;
return i;
}
//判断是否满足矩阵相乘的要求
bool judge( dight ch1 , dight ch2) {
if(ch1.s[1] == ch2.s[0]) {
m.s[0] = ch1.s[0];
m.s[1] = ch2.s[1];
st.push(m);
return 1;
}
else
return 0;
}
char str[100];
int main() {
scanf("%d%*c", &n);
int i;
for(i = 0; i < n; i++)
scanf("%c%d%d%*c",&t[i].name, &t[i].s[0], &t[i].s[1]);
t[i].name = '(';
while(scanf("%s", &str) != EOF) {
int len = strlen(str), sum = 0;
dight ch1, ch2;
if(len != 1) { //只有一个数的情况
for(i = 0; i < len; i++) {
if(str[i] == ')' ) { //碰到右括号就出栈两个数,和左括号
if(st.size() >= 3) {
ch2 = st.top ();
st.pop();
ch1 = st.top ();
st.pop();
if(st.top().name == '(') {
st.pop();
if(judge(ch1, ch2)) //判断满不满足矩阵相乘的要求
sum += ch1.s[0] * ch1.s[1] * ch2.s[1]; //加法步数
else {
sum = -1;
printf("error\n");
break;
}
}
}
else if(st.size() == 1 && st.top().name != '(')
break;
}
else
st.push(t[search(str[i])]); //不是右括号进栈
}
}
if(sum >= 0)
printf("%d\n", sum);
while(!st.empty()) //清空栈
st.pop();
}
return 0;
}