【问题标题】:Matrix Chain Multiplication using Dynamic Programming in C++ Program Crashes?在 C++ 程序崩溃中使用动态编程进行矩阵链乘法?
【发布时间】: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 没有程序只是崩溃。
  • 现在是学习如何使用调试器的好时机。

标签: c++ algorithm dynamic-programming


【解决方案1】:

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

  1. 您从未在表中指定最佳值(当您找到最小总和时,您没有存储它)。因此,每次检查 table[i][j] == 0 时,它都是正确的
  2. 你的循环中的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;
    }
    

    【讨论】:

      猜你喜欢
      • 2017-09-07
      • 1970-01-01
      • 1970-01-01
      • 2012-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-03
      相关资源
      最近更新 更多