UVA 442:Matrix Chain Multiplication 数据结构专题

题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=103&page=show_problem&problem=383

题目类型: 数据结构, 链表

样例输入:

9
A 50 10
B 10 20
C 20 5
D 30 35
E 35 15
F 15 5
G 5 10
H 10 20
I 20 25
A
B
C
(AA)
(AB)
(AC)
(A(BC))
((AB)C)
(((((DE)F)G)H)I)
(D(E(F(G(HI)))))
((D(EF))((GH)I))

样例输出:

0
0
0
error
10000
error
3500
15000
40500
47500
15125

题目大意:

给出一系列的矩阵,给他们取名A ,B……   以及它们的行数和列数。给完后,给出一系列的表达式,然后要求求出按这些表达式进行计算,会有多少次乘法步骤。

本文URL地址:http://www.bianceng.cn/Programming/sjjg/201410/45537.htm

解体思路:

这题和括号匹配那题很像。关键的步骤是计算矩阵乘法次数的这个过程。

#include<cstdio>
#include<cctype>
#include<cstring>
#include<cstdlib>
#include<stack>
using namespace std;  

int sum,n;
int mat[30][2];
int arr[30],prev[30], next[30];
char str[1000];  

void solve(){
    // 如过只有一个矩阵,那么直接输出结果0
    if(strlen(str)==1 && isupper(str[0])){
        printf("0\n");
    }
    else{
        char copyMat[30][2];
        int i,j;
        // 复制一个数组进行操作。 因为后面的操作需要对这些矩阵进行修改
        for(i=0; i<n; ++i){
            copyMat[i][0] = mat[i][0];
            copyMat[i][1] = mat[i][1];
        }
        sum=0;
        stack<char>st;   

        for(i=0; i<strlen(str); ++i){
            if(str[i]=='(' || isupper(str[i]))
                st.push(str[i]);
            else if(str[i]==')'){
                stack<char>temp;
        // 当碰到‘)’时,把栈中的矩阵全都取出来进行计算
                while(isupper(st.top())){
                    temp.push(st.top());
                    st.pop();
                }
                // 把'('也弹出
                st.pop();
                char ex;
                // 取出第一个矩阵(在原表达式中是最左边的一个)
                if(!temp.empty()){
                    ex=temp.top();
                    temp.pop();
                }
                while(!temp.empty()){
                    char multi = temp.top();
                    temp.pop();
                    // 如果左边矩阵的列数和右边矩阵的函数不同,则直接输出 error
                    if(copyMat[ex-'A'][1] != copyMat[multi-'A'][0]){
                        printf("error\n");
                        return ;
                    }
                    // 计算相乘次数,加上
                    sum += copyMat[ex-'A'][0]*copyMat[multi-'A'][0]*copyMat[multi-'A'][1];
                    // 相乘后得到一个新矩阵,更新尺寸
                    copyMat[ex-'A'][1] = copyMat[multi-'A'][1];
                }
                st.push(ex);
            }
        }
        printf("%d\n",sum);
    }
}  

int main()
{
    freopen("input.txt", "r",stdin);
    char ch;
    int  i, j;
    scanf("%d%*c", &n);
    for(i=0; i<n; ++i){
        scanf("%c %d %d%*c",&ch,&mat[i][0],&mat[i][1]);
    }  

    while(gets(str)){
        solve();
    }
    return 0;
}

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索数据结构
, 矩阵
, include
, 矩阵乘法
, 表达式
, 乘法
, 题目
442
daisy chain拓扑结构、multiplication、multiplication table、multiplication rule、cross multiplication,以便于您获取更多的相关知识。

时间: 2024-09-20 13:06:21

UVA 442:Matrix Chain Multiplication 数据结构专题的相关文章

Uva 442 Matrix Chain Multiplication

点击打开链接 题目意思:给定一序列的矩阵,然后对于每一个表达式求出矩阵的乘法次数 解题思路:我们可以想到利用栈的思想,如果读入的字符不是 ')' 那么我们都把它如栈,如果遇到')', 我们往回找到第一个不是左括号后面的所有矩阵然后相乘,在把结果如栈即可 注意事项:由于后面的乘法会改变值,所以我们必须开两个结构体,一个用来存放初始值,另外一个是作为计算是所用,这样就不会有错,还有这一题数据很水,如果直接考虑括号内只有两个矩阵也可以过 代码: #include <cstdio> #include

UVa 101 The Blocks Problem 数据结构专题

题目链接: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=103&page=show_problem&problem=37 题目类型: 数据结构, 二叉树 题意: 有N个位置, 编号为 0-N-1, 初始下,各个位置上放置这和位置编号相同的砖块,即砖块1,砖块2--砖块N-1. 然后有四种命令操作方式: 1.move a onto b :把砖a移动到砖b上面,如果a

UVa 540:Team Queue 数据结构专题

题目链接: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=103&page=show_problem&problem=481 题目类型: 数据结构, 二叉树 样例输入: 2 3 101 102 103 3 201 202 203 ENQUEUE 101 ENQUEUE 201 ENQUEUE 102 ENQUEUE 202 ENQUEUE 103 ENQUEUE 2

UVa 127:"Accordian" Patience 数据结构专题

题目链接: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=63 题目类型: 数据结构, 链表 题意: 发一副牌(52张,分两行), 从左往右开始, 对于当前这张牌,如果有左边第一个或左边第三个的数值(face-value)或者形状(suit)是一样的,就把该张牌移动到左边第一行或者第三行(如果左1和左3都可以移,则优先移动到左3),移动后,

UVa 133:The Dole Queue 数据结构专题

题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=103&page=show_problem&problem=69 题目类型: 数据结构, 链表 题意: N份申请书,排成一个圆圈, 按逆时针方向编号为1-N. 有两个公务员,公务员1站在1,往逆时针方向数到第k份,选中:公务员2站在N,往顺时针方向数到第m份,选中. 取走选中的编号的申请书,输出编号.如果编号一

UVa 10152:ShellSort 数据结构专题

题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=103&page=show_problem&problem=1093 题目类型: 数据结构, 链表 样例输入: 2 3 Yertle Duke of Earl Sir Lancelot Duke of Earl Yertle Sir Lancelot 9 Yertle Duke of Earl Sir Lanc

UVa 1111 Generalized Matrioshkas 数据结构专题

题目链接接: http://uva.onlinejudge.org/index.phpoption=com_onlinejudge&Itemid=8&category=103&page=show_problem&problem=2052 题目类型: 数据结构, 链表 题目大意: 这题的题意比较难懂,看了好几变才明白.  就是有一个可以嵌套娃娃的娃娃,然后嵌套在里面的娃娃又可以继续嵌套娃娃. 然后要求直接嵌套在里面(内一层)的娃娃的尺寸大小之和不能超过外面的. 例如,-3 -

UVa 784:Maze Exploration 搜索专题

题目链接: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=105&page=show_problem&problem=725 题目类型: 搜索 样例输入: 2 XXXXXXXXX X X X X * X X X X XXXXXXXXX X X X X X X XXXXX _____ XXXXX X X X * X X X XXXXX _____ 样例输出: XXXX

UVa 572:Oil Deposits 搜索专题

题目链接: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=105&page=show_problem&problem=513 题目类型: 搜索 样例输入: 1 1 * 3 5 *@*@* **@** *@*@* 1 8 @@****@* 5 5 ****@ *@@*@ *@**@ @@@*@ @@**@ 0 0 样例输出: 0 1 2 2 分析: 这一题可以说是搜索