c语言矩阵相乘在二维数组传入参数时遇到了一些问题

C语言 码拜 4年前 (2017-04-18) 355次浏览
#include <iostream>  
#include <cstdio>  
#include <cstring>  
  
using namespace std;  
  
#define SIZE 100  
#define INF 999999999  
  
int memo[SIZE][SIZE];  
  
//m数组内存放矩阵链的行列信息  
//m[i-1]和m[i]分别为第i个矩阵的行和列(i = 1、2、3...)  
void Traceback(int i,int j,int **s)  
{  
    if(i==j) return;  
    Traceback(i,s[i][j],s);  
    Traceback(s[i][j]+1,j,s);  
    printf("Multiply A %d,%d\n",i,s[i][j]);
	printf("and A %d,%d\n",(s[i][j]+1),j);  
}  
int Best_Memo(int m[], int left, int right)  
{  
    //只有一个矩阵时,返回计算次数0  
    if (left == right)  
    {  
        return 0;  
    }  
  
    int min = INF;  
    int i;  
    //括号依次加在第1、2、3...n-1个矩阵后面  
    for (i = left; i < right; i++)  
    {  
        //计算出这种完全加括号方式的计算次数  
        int count;  
        if (memo[left][i] == 0)  
        {  
            memo[left][i] = Best_Memo(m, left, i);  
        }  
        count = memo[left][i];  
        if (memo[i+1][right] == 0)  
        {  
            memo[i+1][right] = Best_Memo(m, i+1, right);  
        }  
        count += memo[i+1][right];  
        count += m[left-1] * m[i] * m[right];  
        //选出最小的  
        if (count < min)  
        {  
            min = count;  
        }  
    }  
    return min;  
}  
int main(void)  
{  
    int m[SIZE];  
    int n;  
    while (scanf("%d", &n) != EOF)  
    {  
        int i;  
        for (i = 0; i < n; i++)  
        {  
            scanf("%d", &m[i]);  
        }  
        memset(memo, 0, sizeof(memo));  
        printf("%d\n", Best_Memo(m, 1, n-1));
		printf("矩阵最优计算次序为:\n");
    	Traceback(1,n,memo);    
    }  
    return 0;  
}  
解决方案

20

void Traceback(int i,int j,int **s)
改成:
void Traceback(int i,int j,int s[100][100])

5

引用:
//备忘录递归 
#include <stdio.h>   
const int L = 7;  
int LookupChain(int i,int j,int **m,int **s,int *p);  
int MemoizedMatrixChain(int n,int **m,int **s,int *p);  
  
void Traceback(int i,int j,int **s);//构造最优解  
  
int main()  
{  
    int p[L]={30,35,15,5,10,20,25};  
  
    int **s = new int *[L];  
    int **m = new int *[L];  
    for(int i=0;i<L;i++)    
    {    
        s[i] = new int[L];  
        m[i] = new int[L];  
    }   
    printf("矩阵的最少计算次数为:%d\n",MemoizedMatrixChain(6,m,s,p));  
	printf("矩阵最优计算次序为:\n");
	Traceback(1,6,s);  
    return 0;  
}  
//矩阵初始化操作  
int MemoizedMatrixChain(int n,int **m,int **s,int *p)  
{  
    for(int i=1; i<=n; i++)  
    {  
        for(int j=1; j<=n; j++)  
        {  
            m[i][j]=0;  
        }  
    }  
    return LookupChain(1,n,m,s,p);  
}  
//m数组内存放矩阵链的行列信息  
//m[i-1]和m[i]分别为第i个矩阵的行和列(i = 1、2、3...)
int LookupChain(int i,int j,int **m,int **s,int *p)  
{  
    if(m[i][j]>0)  
    {  
        return m[i][j];  
    }  
    if(i==j)  
    {  
        return 0;  
    }  
    int u = LookupChain(i,i,m,s,p) + LookupChain(i+1,j,m,s,p)+p[i-1]*p[i]*p[j];  
    s[i][j]=i;  
    for(int k=i+1; k<j; k++)  
    {  
        int t = LookupChain(i,k,m,s,p) + LookupChain(k+1,j,m,s,p) + p[i-1]*p[k]*p[j];  
        if(t<u)  
        {  
            u=t;  
            s[i][j] = k;  
        }  
    }  
    m[i][j] = u;  
    return u;  
}  
  
void Traceback(int i,int j,int **s)  
{  
    if(i==j) return;  
    Traceback(i,s[i][j],s);  
    Traceback(s[i][j]+1,j,s);  
    printf("Multiply A %d,%d\n",i,s[i][j]);
	printf("and A %d,%d\n",(s[i][j]+1),j);  
}

在这里代码中为什么用**s就行了呢,请高手帮助下

多看基础,**s是一个二级指针,你声明的是动态的二维数组。

10

10

请那些喜欢将数组作为函数参数传来传去或作为函数返回值的码农思考一下为什么不把整个互联网内容当作函数参数传来传去或作为函数返回值呢?c语言矩阵相乘在二维数组传入参数时遇到了一些问题

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明c语言矩阵相乘在二维数组传入参数时遇到了一些问题
喜欢 (0)
[1034331897@qq.com]
分享 (0)