Chinaunix首页 | 论坛 | 博客
  • 博客访问: 17071
  • 博文数量: 5
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 55
  • 用 户 组: 普通用户
  • 注册时间: 2013-02-15 11:38
文章分类

全部博文(5)

文章存档

2013年(5)

我的朋友

分类: C/C++

2013-07-05 18:03:39

以矩阵连乘为例:

#include"stdio.h"

#define Arr_Len 7
void Print(int **s,int i,int j);
void My_MatrixChain(int *p,int n,int **m,int **s)
{
 int i,k;
 for(i=0;i<=n;i++)
 {
   *((int *)(m+i*Arr_Len)+i)=0;
 }
 int r;
 for(r=2;r<=n;r++)
 {
  for(i=1;i<=n-r+1;i++)
  {                                  
   int j=i+r-1;
   *(((int *)(m+i*Arr_Len))+j)=*(((int *)(m+(i+1)*Arr_Len))+j)+p[i-1]*p[i]*p[j]; 
   *(((int *)(s+i*Arr_Len))+j)=i;
   int q;
   for(q=i+1;q
   {
    int temp=*(((int *)(m+i*Arr_Len))+q)+(*(((int *)(m+(q+1)*Arr_Len))+j))+p[i-1]*p[q]*p[j];
    if(temp<(*(((int *)(m+i*Arr_Len))+j)))
    {
     *(((int *)(m+i*Arr_Len))+j)=temp;
     *(((int *)(s+i*Arr_Len))+j)=q;
    }
   }
  }
 }
 /*int l;
 for(i=1;i<=n;i++)
 {
  for(l=1;l<=n;l++)
  {
   
   printf("%d\t",*(((int *)(m+i*Arr_Len))+l));
  }
  printf("\n");
 } */
}
void My_Traceback(int i,int j,int **s)
{
 if(i==j)
 {
  printf("A%d",i);
  return;
 }
 printf("(");
 My_Traceback(i,*(((int *)(s+i*Arr_Len))+j),s);
 My_Traceback((*(((int *)(s+i*Arr_Len))+j))+1,j,s);
 printf(")");
}
int main()
{
 int a[Arr_Len]={30,35,15,5,10,20,25};
 int mm[7][7]={0};
 int ss[7][7]={0};
 int i,l;
 My_MatrixChain(a,6,(int **)mm,(int **)ss);
 printf("(A1-A6)最少计算次数:%d\n",mm[1][6]);
 printf("按断点输出:\n"); 
 My_Traceback(1,6,(int **)ss);
 printf("\n");
 return 0;
}


传递的参数为二维指针,不能用m[i][j],编译器不能正确的进行寻址。可以用另外一种方式,因为二维指针是一个指向指针的指针所以可以采用下面一种方式,*((int*)m+i*n+j),其实参数传递的时候也可以直接采用m[][10]的方式进行传递,第二维的数一定不能省略而且还必须要和传递的实参相对应。
阅读(1379) | 评论(0) | 转发(0) |
0

上一篇:判断一个链表是否有回环

下一篇:没有了

给主人留下些什么吧!~~