在 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++ 程序崩溃中使用动态编程进行矩阵链乘法?的主要内容,如果未能解决你的问题,请参考以下文章