知识点与难度
字符串、栈、中等难度
描述
矩阵乘法的运算量与矩阵乘法的顺序强相关。
例如:
A是一个50×10的矩阵,B是10×20的矩阵,C是20×5的矩阵
计算A*B*C有两种顺序:((AB)C)或者(A(BC)),前者需要计算15000次乘法,后者只需要3500次。
编写程序计算不同的计算顺序需要进行的乘法次数。
数据范围:矩阵个数:1≤n≤15 ,行列数:1≤rowi,coli≤100 ,保证给出的字符串表示的计算顺序唯一。
进阶:时间复杂度: O(n) ,空间复杂度:O(n)
输入描述:
输入多行,先输入要计算乘法的矩阵个数n,每个矩阵的行数,列数,总共2n的数,最后输入要计算的法则
计算的法则为一个字符串,仅由左右括号和大写字母('A'~'Z')组成,保证括号是匹配的且输入合法!
输出描述:
输出需要进行的乘法次数
输入输出示例:
输入:
3
50 10
10 20
20 5
(A(BC))
输出:
3500
我的代码:
#include <iostream>
using namespace std;
struct MM {
int x;
int y;
};
int i = 0;
string s;
int count = 0;
MM getcount(int start, int end, MM* M) {
MM M1; //记录当前矩阵
MM M2; //记录前几个矩阵相乘的结果
M2.x = 0;
M2.y = 0;
int key = 0;
while (i < s.length()) {
if (s[i] == '(') {
i++;
M1 = getcount(i, end, M);
if (M2.x == 0) {
M2 = M1;
} else {
count = count + M2.x * M2.y * M1.y;
M2.y = M1.y;
}
} else if (s[i] >= 'A' && s[i] <= 'Z') {
M1 = M[s[i] - 'A'];
if (M2.x == 0) {
M2 = M1;
} else {
count = count + M2.x * M2.y * M1.y;
M2.y = M1.y;
}
i++;
} else {
i++;
break;
}
}
return M2;
}
int main() {
int n;
cin >> n;
MM* M = new MM[n];
for (int i = 0; i < n; i++) {
cin >> M[i].x >> M[i].y;
}
cin >> s;
getcount(0, s.length() - 1, M);
cout << count << endl;
}
// 64 位输出请用 printf("%lld")
我的代码分析:
借鉴了之前做的四则运算器的思路,采用递归的方式来计算括号内的表达式,变读取字符串边算,最后结果存储到M2矩阵当中,设置全局变量count来记录乘法的计算次数。
top1代码:
#include <iostream>
using namespace std;
int main(){
cout<<"hello world!"<<endl;
}
top1代码分析:
我发现这个top1的运行时间和内存和算法好像没啥关系,所以top1代码暂时先不贴了,除非我思路不太清晰或者算法复杂度太大。
总结:
计算表达式用递归也不错,比栈要简单啊