| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3550 人关注过本帖
标题:二维数组做参数--矩阵连乘问题
只看楼主 加入收藏
diaoxue
Rank: 1
等 级:新手上路
帖 子:142
专家分:0
注 册:2007-6-1
收藏
 问题点数:0 回复次数:12 
二维数组做参数--矩阵连乘问题
我觉得是参数出现错误了,但不知道怎么改
下面是矩阵连乘问题的算法实现
#include<iostream.h>
void MatrixChain(int p[],int n,int m[6][6],int s[6][6]);
void Traceback(int i,int j,int s[6][6]);
int main()
{
int p[]={30,35,15,5,10,20,25};
int n=6;
int m[6][6];
int s[6][6];
MatrixChain(p,n,m,s);
int i=1,j=6;
Traceback(i,j,s);
return 0;
}
void MatrixChain(int p[],int n,int m[6][6],int s[6][6])
{
for(int i=0;i<n;i++)m[i][i]=0;
for(int r=1;r<n;r++)
for(int i=0;i<n-r+1;i++)
{
int j=i+r-1;
m[i][j]=m[i+1][j]+p[i-1]*p[i]*p[j];
s[i][j]=i;
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;
}
}
}
}
void Traceback(int i,int j,int s[6][6])
{
if(i==j)cout<<"no-op"<<endl;
Traceback(i,s[i][j],s);
Traceback(s[i][i]+1,j,s);
cout<<"Multiply A"<<i<<","<<s[i][j];
cout<<"and A"<<(s[i][j]+1)<<","<<j<<endl;
}
搜索更多相关主题的帖子: 矩阵 参数 int void MatrixChain 
2007-10-23 09:15
aipb2007
Rank: 8Rank: 8
来 自:CQU
等 级:贵宾
威 望:40
帖 子:2879
专家分:7
注 册:2007-3-18
收藏
得分:0 

确实是参数越界了,上溢,下溢都存在。

你的m,s是定义的size = 6,那么实际取值就是 0 1 2 3 4 5

这与矩阵的对应就不是1,1对应。
比如m[0][5]表示1-6的矩阵连乘的最小代价

你自己检查算法中p的取值范围,应该注意+1
更好的办法是定义m,s的size=7,那么浪费m[0][i]m[i][0]不用,而直接与矩阵11对应。

算法是没有问题的。


Fight  to win  or  die...
2007-10-23 11:14
nuciewth
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:我爱龙龙
等 级:贵宾
威 望:104
帖 子:9786
专家分:208
注 册:2006-5-23
收藏
得分:0 
DP法,算法上没有错误.是这样.
求MatrixChain函数是没有错的.
还有参数并没有溢出,定义的行参最好不要把写成这样,你可以直接用**m,等二级指针来表示
最大的错误就是下面的递归没有出口
void Traceback(int i,int j,int **s)
{
if(i==j)cout<<"no-op"<<endl;//应该在这个条件里结束递归
Traceback(i,s[i][j],s);
Traceback(s[i][i]+1,j,s);
cout<<"Multiply A"<<i<<","<<s[i][j];
cout<<"and A"<<(s[i][j]+1)<<","<<j<<endl;
}

倚天照海花无数,流水高山心自知。
2007-10-23 12:01
aipb2007
Rank: 8Rank: 8
来 自:CQU
等 级:贵宾
威 望:40
帖 子:2879
专家分:7
注 册:2007-3-18
收藏
得分:0 
m[i][j]=m[i+1][j]+p[i-1]*p[i]*p[j];

i是可以取到0的,所以p[0-1]越界。

还有,直接用**m形式的指针来引用2维数组是错的。

可以用int[][N]或者int (*)[N]

Fight  to win  or  die...
2007-10-23 21:36
diaoxue
Rank: 1
等 级:新手上路
帖 子:142
专家分:0
注 册:2007-6-1
收藏
得分:0 

我改了后调试没出错,但运行时出错


上善若水,水善利万物而不争,处众人之所恶
2007-10-25 08:46
jonc
Rank: 1
等 级:新手上路
帖 子:69
专家分:0
注 册:2007-3-25
收藏
得分:0 

就是数组越界
void MatrixChain(int p[],int n,int m[6][6],int s[6][6])
{
for(int i=0;i<n;i++)m[i][i]=0;
for(int r=1;r<n;r++)
for(int i=0;i<n-r+1;i++)
{
int j=i+r-1;
m[i][j]=m[i+1][j]+p[i-1]*p[i]*p[j];// 中上下都溢出
s[i][j]=i;
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;
}
}
}
}


菜鸟也想高飞
2007-11-10 10:18
diaoxue
Rank: 1
等 级:新手上路
帖 子:142
专家分:0
注 册:2007-6-1
收藏
得分:0 
回复:(diaoxue)我改了后调试没出错,但运行时出错
我写的好多关于数组的程序都溢出了
下标是从0开始吧 有什么要注意的吗

上善若水,水善利万物而不争,处众人之所恶
2007-11-10 17:05
diaoxue
Rank: 1
等 级:新手上路
帖 子:142
专家分:0
注 册:2007-6-1
收藏
得分:0 
回复:(jonc)就是数组越界void MatrixChain(int p[]...

的确是越界了
我写的好多程序都是这样 编译没错,运行就不行了
想了好久,还是不能解决
能否给点指点啊


上善若水,水善利万物而不争,处众人之所恶
2007-11-18 17:20
neverDie
Rank: 1
等 级:新手上路
威 望:1
帖 子:123
专家分:0
注 册:2007-5-5
收藏
得分:0 

说明你思路不清晰


2007-11-18 19:42
codelet
Rank: 2
来 自:广东深圳
等 级:论坛游民
帖 子:61
专家分:37
注 册:2007-11-6
收藏
得分:0 
自己设几个断点,跟踪一下程序,就容易发现问题在哪了

Losing emotion, Finding devotion.
2007-11-19 09:13
快速回复:二维数组做参数--矩阵连乘问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.057654 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved