矩阵链乘

矩阵链乘之结构体构造函数

struct构造函数,和构造函数的重载函数长这个样子,和C++的构造函数差不过。

struct Dog {
    Dog()
    {
        name = "wangwang";
        age = 10;
    }
    string name;
    int age;
};
struct Dog {
    Dog()
    {
        name = "Ao di";
        age = 2;
    }
    Dog(string n)
    {
        name = n;
        age = 10;
    }
    Car(string n, int c)
    {
        name = n;
        age = c;
    }
    string name;
    int age;
};

下面这个厉害了:

struct Dog {
    Dog(string n = "Lihao", int c = 10) : name(n), age(c) {} //name = n, age = c
    string name;
    int age;
};

这种构造函数非常好用。如果你只是想初始化一些变量。

结合uva442的AC代码,看看这种用法。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<stack>
#include<string>
using namespace std;
#define maxn 30

struct matrix{
    int a, b;
    matrix(int a=0, int b=0) :a(a), b(b){} //神奇的构造函数。
}mat[maxn];

int main()
{
    int m;
    cin >> m;
    for (int i = 0; i < m; i++){
        char name;
        cin >> name;
        cin >> mat[name - ‘A‘].a >> mat[name - ‘A‘].b;
    }

    char exp[200];
    stack<matrix> s;
    while (cin >> exp){
        int len = strlen(exp);
        bool error = false;
        int ans = 0;
        for (int i = 0; i < len; i++){
            if (exp[i] >= ‘A‘&&exp[i] < ‘Z‘)
                s.push(mat[exp[i] - ‘A‘]);
            else if (exp[i] == ‘)‘){
                matrix m1 = s.top(); s.pop();
                matrix m2 = s.top(); s.pop();
                if (m2.b != m1.a) { error = true; break; }
                ans += m2.a*m1.a*m1.b;
               s.push(matrix(m2.a, m1.b));//初始化之后,系统会生成一个指向该结构体的地址。
            }
        }
        if (error) cout << "error" << endl;
        else cout << ans << endl;
    }
    return 0;
}
时间: 2024-10-17 09:11:44

矩阵链乘的相关文章

矩阵链乘(Matrix Chain Multiplication)

输入n个矩阵的维度和一些矩阵链乘表达式,输出乘法的次数.如果乘法无法进行,则输出error.假定A是m*n矩阵,B是n*p矩阵,那么A*B是m*p矩阵,乘法次数为m*n*p.如果A的列数不等于B的行数,则乘法无法进行. 例如,A是50*10的,B是10*20的,C是20*5的,则(A(BC))的乘法次数为10*20*5(BC的乘法次数) +50*10*5(A(BC)的乘法次数) = 3500. #include<cstdio> #include<stack> #include<

POJ 0016 20603矩阵链乘

传送门:http://oj.cnuschool.org.cn/oj/home/solution.htm?solutionID=35454 20603矩阵链乘 难度级别:B: 运行时间限制:1000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 输入n个矩阵的维度和一些矩阵链乘的表达式,输出乘法的次数.如果乘法无法进行,输出error.假定A是m*n矩阵,B是n*p矩阵,则乘法的次数为m*n*p.如果矩阵A的列数不等于矩阵B的行数,则这两个矩阵无法进行乘法运算.例

动态规划之矩阵链

dp有很多个经典应用,矩阵链是其中一个. 对于我这种数学不好的人,需要回顾矩阵性质. 若矩阵A的维数是p×q,矩阵B的维数是q×r,则A与B相乘后所得矩阵AB的维数是p×r.按照矩阵相乘的定义,求出矩阵AB中的一个元素需要做q次乘法(及q-1次加法).这样,要计算出AB就需要做p×q×r次乘法.由于加法比同样数量的乘法所用时间要少得多,故不考虑加法的计算量. 看下面一个例子,计算三个矩阵连乘{A1,A2,A3}:维数分别为10*100 , 100*5 , 5*50 按此顺序计算需要的次数((A1

UVa 442 矩阵链乘及scanf说明符中的\n

题目:计算题给矩阵相乘次序所需的相乘次数.   我们已知的m*n和n*k矩阵相乘,得到的是m*k矩阵,但需要的相乘次数是m*n*k(开始当成了m*k %>_<%).evaluate,求值 思路:每个矩阵用结构体表示,有名字.行.列.需要计算的次数.矩阵相乘的过程用栈来模拟.遇到左括号(,压栈这是自然的.遇到一个矩阵时,检查栈顶,如果栈顶元素是左括号,则压栈,否则就是矩阵,则比较栈顶矩阵和输入矩阵是否匹配,如果匹配则修改栈顶矩阵的列.计算次数,这样输入矩阵对栈顶进行了修改,相当于完成了相乘,这时

矩阵乘法及矩阵链乘的快速幂优化

一.矩阵乘法 1 struct datatype 2 { 3 int a[2][2]; 4 }; 5 datatype multiple(datatype x,datatype y) 6 { 7 datatype res; 8 memset(res.a,0,sizeof(res.a)); 9 for(int i=0;i<=1;i++) 10 { 11 for(int j=0;j<=1;j++) 12 { 13 for(int k=0;k<=1;k++) 14 { 15 res.a[i][

矩阵链相乘问题

问题描述 给定n个矩阵A1,A2 ,...,An,相邻的矩阵是可乘的,如何确定一个最优计算次序,使得以此次序计算需要的数乘次数最少? 计算次序对计算性能的影响: 假设n=3,A1,A2,A3的维数分别为10×100,100×5,5×50.考察A1×A2×A3需要的数乘次数,有以下 两种计算方式: (1)(A1×A2)×A3:10×100×5+10×5×50=7500 (2) A1×(A2×A3):100×5×50+10×100×50=75000 通过这个简单的例子足以说明,矩阵的计算次序对计算性

算法13---动态规划矩阵链乘法

算法13---动态规划矩阵链乘法 矩阵链乘法是动态规划里面使用到的一个例子 1 两个矩阵的计算 那么对于一个矩阵的乘法,首先如果是两个矩阵的乘法,那么如何实现呢? 注意到我们使用二维数组表示矩阵,但是二维数组不能作为函数的返回值.具体实现如下 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <math.h> 4 5 #define a_rows 3 6 #define a_columns 4 7 #define

动态规划-矩阵链乘法

问题描述: 给定由n个要相乘的矩阵构成的序列(链)<A1,A2,...,An>,要计算乘积A1A2...An,可以将两个矩阵相乘的标准算法作为一个子程序,通过加括号确定计算的顺序(对同一矩阵链,不同的计算顺序所需要的计算次数大不相同). 目标问题:给定n个矩阵构成的矩阵链<A1,A2,...,An>,其中,i=1,2,...,n,矩阵Ai的维数为pi-1×pi,对乘积A1A2...An以一种最小计算次数加全部括号. 穷尽搜索: 令P(n)表示一串n个矩阵可能的加全部方案数.当n=1

Algorithm --&gt; 矩阵链乘法

动态规划--矩阵链乘法 1.矩阵乘法 Note:只有当矩阵A的列数与矩阵B的行数相等时A×B才有意义.一个m×r的矩阵A左乘一个r×n的矩阵B,会得到一个m×n的矩阵C. #include <iostream> using namespace std; #define A_ROWS 3 #define A_COLUMNS 2 #define B_ROWS 2 #define B_COLUMNS 3 void matrix_multiply(int A[A_ROWS][A_COLUMNS],in