在 C++ 程序崩溃中使用动态编程进行矩阵链乘法?

Posted

技术标签:

【中文标题】在 C++ 程序崩溃中使用动态编程进行矩阵链乘法?【英文标题】:Matrix Chain Multiplication using Dynamic Programming in C++ Program Crashes? 【发布时间】:2014-09-30 12:22:53 【问题描述】:

我编写了以下 C++ 程序来实现使用动态编程实现 MCM。但是下面的程序崩溃了。我的代码有什么问题?

#include<iostream>
#include<cstdlib>
#define SZ 10
using namespace std;

int table[SZ][SZ];
int P[] = 2,3,3,5;

int MCM(int i, int j)

    if(i==j) return 0;

    else
    
        int min = INT_MAX;

        for(int k=i;k<=j;k++)
        
            if(table[i][k]==0)
                table[i][k] = MCM(i,k);
            if(table[k+1][j]==0)
                table[k+1][j] = MCM(k+1,j);
            int sum = table[i][k] + table[k+1][j] + P[i-1]*P[j]*P[k];
            if(sum<min)
                min = sum;  
        
        return min;
    


int main()

    int size = sizeof(P)/sizeof(P[0]);
    printf("Minimum number of mutiplications is %d",MCM(0,size-1));
    return 0;

【问题讨论】:

是否有错误信息显示? @BobJarvis 没有程序只是崩溃。 现在是学习如何使用调试器的好时机。 【参考方案1】:

您的代码将进入无限循环。另外你犯了一些错误:

    您从未在表中指定最佳值(当您找到最小总和时,您没有存储它)。因此,每次检查 table[i][j] == 0 时,它都是正确的 你的循环中的k可以等于j并且你使用的是k+1,这是一个错误

无论如何,我认为您的代码的正确版本应该是这样的:

#include<iostream>
#include<cstdlib>
#define SZ 10
using namespace std;

int table[SZ][SZ];
int P[] = 1,2,3,4;

int MCM(int i, int j)

    if(i==j) return 0;

    else
    
        int min = INT_MAX;

        for(int k=i;k<j;k++)
        
            if(table[i][k]==0)
                table[i][k] = MCM(i,k);
            if(table[k+1][j]==0)
                table[k+1][j] = MCM(k+1,j);
            int sum = table[i][k] + table[k+1][j] + P[i]*P[j]*P[k];
            if(sum<min)
                min = sum;
       
       table[i][j] = min;
       return min;
   

int main()

    int size = sizeof(P)/sizeof(P[0]);
    printf("Minimum number of mutiplications is %d",MCM(0,size-1));
    return 0;

【讨论】:

【参考方案2】:

第一次调用 MCM(0, size-1) 时,参数 i = 0,但随后减去 1 并使用结果 -1 来访问 P[-1](第 23 行)。这可能会导致崩溃。

【讨论】:

修复程序崩溃后,我认为函数的参数有问题,但我无法弄清楚。【参考方案3】:

我知道这有什么问题,这只是一个小错误

第 17 行上的循环应该在条件处结束

k<j 

而不是在

k<=j

程序编译运行成功

#include<iostream>
#include<cstdlib>
#define SZ 10
using namespace std;

int table[SZ][SZ];
int P[] = 1, 2, 3, 4, 3;

int MCM(int i, int j)

    if(i==j) return 0;

    else
    
        int min = INT_MAX;

        for(int k=i;k<j;k++) // bug was here: for(int k=i;k<=j;k++)
        
            if(table[i][k]==0)
                table[i][k] = MCM(i,k);
            if(table[k+1][j]==0)
                table[k+1][j] = MCM(k+1,j);
            int sum = table[i][k] + table[k+1][j] + P[i-1]*P[j]*P[k];
            if(sum<min)
                min = sum;  
        
        return min;
    


int main()

    int size = sizeof(P)/sizeof(P[0]);
    printf("Minimum number of mutiplications is %d",MCM(1,size-1));
    return 0;

【讨论】:

以上是关于在 C++ 程序崩溃中使用动态编程进行矩阵链乘法?的主要内容,如果未能解决你的问题,请参考以下文章

动态规划—矩阵链乘法

c++动态内存分配-矩阵乘法

[动态规划] 矩阵链乘法问题

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

算法矩阵列乘法 | 动态规划

MCM(矩阵链乘法)