矩阵乘法的运算量与矩阵乘法的顺序强相关。
例如:
A是一个50×10的矩阵,B是10×20的矩阵,C是20×5的矩阵
计算ABC有两种顺序:((AB)C)或者(A(BC)),前者需要计算15000次乘法,后者只需要3500次。
编写程序计算不同的计算顺序需要进行的乘法次数。
本题含有多组样例输入!
我的思路是 遍历计算规则 取两个操作字符 第一个前面一定是( 入栈 非第一个就开始计算
a(bcd) bcd 算完结果返回b 读到) 就把b插入)后面待读取做下一个操作字符
报错信息段错误!
改了几遍了 还是过不了 完全不知问题在哪!
源代码:
#include<iostream>
#include<string>
#include<vector> //vector用于存放矩阵向量
#include<stack> //stack用于字符串的存取处理
using namespace std;
int pos;//递归 四则运算指针
stack<char> st;
int docal(string &s,vector<vector<int>> v){
int sum=0;
char a,b;//操作符AB
//stack<char> st;
int mark;
while(pos<s.size()){
if(s[pos]=='('){//入栈 作为第一个操作符的标识
st.push(s[pos]);
pos++;
sum+=docal(s, v);//递归 算括号内的乘法次数
}
else if(isalpha(s[pos])&& st.top()=='(' ){//栈内有左括号说明是第一个操作符a 错误就在这里! 调试卡在这
st.push(s[pos]);
mark=pos;//标记起始操作符
}
else if(st.top()!='('&&(isalpha(s[pos]))){//非第一个 计算 直到)终止
b=s[pos];
a=st.top();
int aa=a-'A';
int bb=b-'A';
sum+=v[aa][0]*v[aa][1]*v[bb][1];
v[aa][1]=v[bb][1];
}
else if(s[pos]==')'){//终止标识 将起始操作符a和对应的( 出栈
st.pop();//a出栈
st.pop();//( 出栈
s=s.insert(pos,pos+1,s[mark]);//把起点操作符插入后面待读取
pos++;
break;
}
pos++;
}
return sum;
}
int main()
{//矩阵乘法分析:a[50 10] b[10 20]计算次数=50*10*20=10000 得到d[50][20]
//括号优先级 stack处理
//二维向量存两两的矩阵行列数 一维下角标有点绕
//而且计算结果存放前还得删除之前用掉的两个矩阵数据
int n;
while(cin>>n)
{
int ans=0;
vector<vector<int>> v(n,vector<int>(2,0));
for(int i=0;i<n;i++){
for(int j=0;j<2;j++)
cin>>v[i][j];
}
string s;//getline居然没读到s
cin>>s;
pos=1;
ans=docal(s,v);
cout<<ans;
}
}