100分求解程序错误
下面这个程序是关于矩阵连乘问题的,运行没有什么问题,可是程序执行结果不对,我找了半天错误也不知道错在哪里了,希望哪位大虾帮帮忙,看看错在哪里了,把正确的程序发出来,谢谢了.
描述:给定n 个矩阵{A1, A2,...,An},其中Ai与Ai+1是可乘的,i=1,2…,n-1。
考察这n个矩阵的连乘积A1A2...An。矩阵A 和B 可乘的条件是矩阵A的列数
等于矩阵B 的行数。若A 是一个p x q矩阵,B是一个q * r矩阵,则其乘积C=AB
是一个p * r矩阵,需要pqr次数乘。
矩阵连乘积的最优计算次序问题,即对于给定的相继n 个矩阵{A1,A2,...,An}
(其中矩阵Ai的维数为 pi-1 * pi,i=1,2,…,n),确定计算矩阵连乘积
A1A2...An 的计算次序,使得依此次序计算矩阵连乘积需要的数乘次数最少。
编程任务:对于给定的相继n个矩阵{A1, A2, ..., An }及其维数,编程计算矩阵连
乘积A1A2...An 需要的最少数乘次数。
数据输入:由文件input.txt 给出输入数据。第1 行是给定的正整数n,表示有n 个矩阵
连乘。第2行是n+1个正整数P0 , P1, ..., Pn ,表示矩阵Ai 的维数
为pi-1 * pi ,i=1,2,…,n。
结果输出:将计算出的最少数乘次数输出到文件output.txt。
#include <iostream.h>
#include <fstream.h>
#include <stdio.h>
//--------------------- 变量、函数定义 开始 ------------------
ofstream myoutf("output.txt"); //输出到文件,全局变量
/*----------------- MatrixChain函数定义 ----------------------
* 函 数 名: MatrixChain *
* 返回类型: void 无返回值 *
* 参数说明: p[] 矩阵的维数 *
* n 矩阵连乘的个数 *
* m 保存矩阵最少连乘个数的二维数组 *
* 功 能: 输出 n个矩阵连乘的最优值 *
* 调用示例: MatrixChain(p,n,m); *
*-----------------------------------------------------------*/
void MatrixChain(int * p,int n,int * * m)
{
for (int i =1; i <= n; i++) m[i][i] = 0;//当i=j时,m[i][j]=0
for (int r =2; r <= n; r++)
for (int i =1; i <= n-r+1; i++)
{
int j = i + r -1;
// 因为不知道k的位置,所以m[i][j]递归的看作
// m[i][i] + m[i+1][j] + p[i-1] * p[i] * p[j];
// 然后通过下面的循环,找到k的位置
m[i][j] = m[i+1][j] + p[i-1] * p[i] * p[j];
//s[i][j] = i;
//假设在k位置断开,然后计算最少乘数,
for (int k = i+1; k < j; k++)
{
int t = m[i][k] + m[k+1][j] + p[i-1] * p[k] * p[j];
//==========判断最小的乘数,保存到数组里============
if (t < m[i][j])
{
m[i][j] = t;
//s[i][j] = k;
}//if
//=================================================
}//for k
}//for i
myoutf << m[1][n] << endl; //输出结果到文件
}//void MatrixChain
//--------------------- 变量、函数定义 结束 ------------------
//--------------------- 主函数 开始 --------------------------
void main()
{
int MatrixNum; //定义连乘的矩阵数
int i , j;
int * p;
int * * m; //保存最优值数组
ifstream myinf("input.txt",ios::nocreate); //读取文件
if (myinf.fail())
{
cerr << "读入文件时,出错!";
return; //如果没有输入文件,则返回错误
}//if (myinf.fail())
myinf >> MatrixNum; //读取矩阵个数
cout << MatrixNum << endl;
if (MatrixNum <= 0)
{
cerr << "矩阵连乘个数不合法,出错!";
return; //如果没有输入文件,则返回错误
}// if (MatrixNum > 0)
p = new int[MatrixNum + 1]; //分配矩阵维数数组空间
if (p == NULL)
{
cerr << "数组空间分配不成功,出错!";
return;
}// if (p != NULL)
for (i = 0;i < MatrixNum +1 ; i++)//读入矩阵维数
{
myinf >> p[i];
cout << p[i] << " ";
}//for i <= MatrixNum
cout << endl;
//----------- 定义二维动态数组 开始 --------------
m = new int * [MatrixNum + 1]; //给一维数组动态分配内存
for (i=0 ; i < MatrixNum +1; i++)
{
m[i] = new int[MatrixNum +1];
}//for 分配二维数组空间
for (i=0 ; i < MatrixNum + 1;i++) //给数组初始化
for (j = 0; j < MatrixNum +1;j++)
{
m[i][j] = 0;
}//for
//----------- 定义二维动态数组 结束 --------------
MatrixChain(p,MatrixNum, m); //调用动态规划矩阵连乘算法
//--------释放数组---------
for(i=0;i < MatrixNum +1 ; i++) delete[] m[i];
delete[] m; //释放二维数组空间
delete[] p; //释放矩阵维数数组空间
myinf.close(); //关闭输入文件
myoutf.close(); //关闭输出文件
}//void main()
//--------------------- 主函数 结束 --------------------------
问题点数:100、回复次数:12Top
1 楼et007123(程序人生)回复于 2005-10-18 17:38:32 得分 0
比如在 input.txt 中输入
3
10,100,5,50
的输出结果应为7500.Top
2 楼chenhu_doc(^0^纯一狼^0^ 看书看到大笑,直到不能自已)回复于 2005-10-18 17:46:08 得分 0
我顶一下 上玩课在回来侃侃!Top
3 楼n6002(犇犇犇犇犇犇犇犇犇犇犇犇犇犇犇犇犇犇犇犇犇犇犇犇犇犇犇犇犇犇犇犇犇犇犇犇犇犇犇犇犇犇犇犇犇犇犇犇犇犇)回复于 2005-10-18 18:32:33 得分 40
input.txt
3
10 100 5 50
output.txt
7500Top
4 楼K()回复于 2005-10-18 18:57:55 得分 0
gzTop
5 楼nanhaochen()回复于 2005-10-22 21:40:32 得分 0
upTop
6 楼v41dugu(一步一生)回复于 2005-10-22 23:31:47 得分 0
长了~~难得看Top
7 楼k9k6k3(我从不玩命)回复于 2005-10-23 04:49:24 得分 0
up
Top
8 楼csucdl(csucdl)回复于 2005-10-23 07:59:40 得分 40
input.txt
3
10 100 5 50
注意不要加逗号
output.txt
7500Top
9 楼cxyol(C++,VC 学习中......)回复于 2005-10-23 10:33:41 得分 0
mark
Top
10 楼karlfly(flykarl)回复于 2005-10-23 20:46:26 得分 0
也太长了啊Top
11 楼oosky2004(我要好东西)回复于 2005-10-24 09:22:17 得分 0
Mark
Top
12 楼csucdl(csucdl)回复于 2005-10-24 09:28:10 得分 20
算法很好啊,动态规划
Top




