矩阵链乘法打印矩阵的序列

时间:2016-05-01 05:15:39

标签: c++ matrix multiplication chain

我在c ++中用动态编程编写了矩阵链乘法代码。 在递归调用中存在错误,用于打印矩阵的正确括号。我从文本文件中获取输入并在文本文件上输出。请帮忙..

#include <iostream>
#include <fstream>
#include <limits.h>
using namespace std;
int * MatrixChainOrder(int p[], int n)
{
    static   int m[100][100];
    static int s[100][100];
    int j, q;
    int min = INT_MAX;
    for (int i = 1; i <= n; i++)
        m[i][i] = 0;

    for (int L = 2; L <= n; L++) {
        for (int i = 1; i <= n - L + 1; i++) {
            j = i + L - 1;
            m[i][j] = min;
            for (int k = i; k <= j - 1; k++) {
                q = m[i][k] + m[k + 1][j] + p[i - 1] * p[k] * p[j];
                if (q < m[i][j]) {
                    m[i][j] = q;
                    s[i][j] = k;
                }
            }
        }
    }
    return (*s);
}

void Print(int *s, int i, int j)
{
    ofstream outfile("output.text");

    if (i == j)
    {
        outfile << "a1";
    }
    else
        outfile << "(";
    {
        Print(*s, i, s[i][j]);
        Print(*s, s[i][j] + 1, j);
        outfile << ")";
    }
    outfile.close();
}

int main()
{
    int arr[100];
    int num, i = 0;
    ifstream infile("input.text");
    while (infile)
    {
        infile >> num;
        arr[i] = num;
        i++;
    }
    i = i - 1;
    infile.close();
    Print(MatrixChainOrder(arr, i - 1), 0, i - 1);
    return 0;
}

1 个答案:

答案 0 :(得分:0)

在C ++中,最好对数组使用std::vector。除此之外,你不能混合像这样的指针和数组,因为编译器会丢失对数组大小的跟踪。

例如,这不起作用:

int x[10][20];
void foo(int *ptr)
{
    //the numbers 10 and 20 have not been passed through
}

但您可以将其更改为

int x[10][20];
void foo(int arr[10][20])
{
    //the numbers 10 and 20 are available
}
根据此link

MatrixChainOrder应该返回一个数字

int MatrixChainOrder(int s[100][100], int p[], int n)
{
    int m[100][100];
    for (int i = 0; i < 100; i++) m[i][i] = 0;
    for (int i = 0; i < 100; i++) s[i][i] = 0;
    int q = 0;
    for (int L = 2; L <= n; L++) {
        for (int i = 1; i <= n - L + 1; i++) {
            int j = i + L - 1;
            m[i][j] = INT_MAX;
            for (int k = i; k <= j - 1; k++) {
                q = m[i][k] + m[k + 1][j] + p[i - 1] * p[k] * p[j];
                if (q < m[i][j]) {
                    m[i][j] = q;
                    s[i][j] = k;
                }
            }
        }
    }
    return q;
}

int main()
{
    int arr[] = { 40, 20, 30, 10, 30 };
    int array_size = sizeof(arr) / sizeof(int);
    int n = array_size - 1;
    int s[100][100];
    int minimum = MatrixChainOrder(s, arr, n);
    printf("{ 40, 20, 30, 10, 30 } should result in 26000 : %d\n", minimum);
    return 0;
}

同样,您可以更改Print功能

void Print(int s[100][100], int i, int j)
{
    if (i < 0 || i >= 100 || j < 0 || j >= 100)
    {
        cout << "array bound error\n";
    }
    //safely access s[i][j] ...
}