#include <string>
#include <iostream>
#include <vector>
#include <iomanip>
using namespace std;
int main()
{
double m[7][7]; //2d dimension array m
int s[7][7]; //2d dimension array s
int p[7] = {30,35,15,5,10,20,25}; //array p to store numbers
int j;
double q;
int n = 5;
for(int i = 1; i != n; ++i) //initialize m[1][1], m[2][2], ... to zero
m[i][i] = 0;
for(int l = 2; l != n; ++l) // performing the algorithm
{
for(int i = 1; i != (n-l+1); ++i)
{
j = i + (l-1);
m[i][j] = numeric_limits<double>::max(); // find the 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;
}
}
}
}
以下测试:
for(int i = 0; i != 4; ++i)
{
for(int j = 0; j != 4; ++j)
{
// print the m[i][j] to test the output
cout << "m[" << i << "][" << j << "] " << " = " << m[i][j] << endl;;
}
}
}
我正在执行矩阵链顺序,输出(我的测试用例)在执行算法后应该有值。但它就像图片一样零。例如,m 1 [2]应为30 * 35 * 15 = 15750。
答案 0 :(得分:0)
C数组的索引从0
开始,而不是1
。
更改
for(int i = 1; i != n; ++i)
m[i][i] = 0;
到
for(int i = 0; i != n; ++i)
m[i][i] = 0;
更改
for(int l = 2; l != n; ++l)
{
for(int i = 1; i != (n-l+1); ++i)
到
for(int l = 1; l != n; ++l)
// Start from 1 instead of 2
{
for(int i = 0; i != (n-l+1); ++i)
// Start from 0 instead of 1
<强>更新强>
目前还不清楚你的算法是什么,但行
for(int k = i; k != (j-1); ++k)
似乎是一个问题。当你进入循环时,你有:
l = 1
i = 0
j = 0
您将k
初始化为i
,即0
。因此,条件k != (j-1)
永远不会成立,并且循环会一直运行,直到达到某种限制 - 很可能会产生浮点数的溢出/下溢。
更改该行:
for(int k = i; k < (j-1); ++k)
会让你的程序运行,但我不知道这是否是你程序的正确逻辑。
答案 1 :(得分:0)
我建议更改一些for循环布尔语句 “(整数)!=(整数)”到“(整数)&lt; =(整数)”取决于具体情况。例如,在执行算法步骤之后的for循环中,您有:
for(int i = 1; i != (n-l+1); ++i)
相当于for(int i = 1; i < (n-l+1); i++)
但算法的正确for循环是:
for(i=1;i<=n-l+1;i++)
此算法中n
是乘以矩阵的数量,int p[]
保持维度。如果有n
维,则应该有n-1
个矩阵。
也到最后
m[1][n-1]
保持矩阵链的最小乘法次数。
GeeksforGeeks在解释算法如何工作方面做得非常出色,并且他们使用了类似的算法。看看你是否还有兴趣:
http://www.geeksforgeeks.org/dynamic-programming-set-8-matrix-chain-multiplication/