动态规划 矩阵连乘问题

在这里插入图片描述
在这里插入图片描述
记住两个矩阵相乘次数的计算方法 (虽然我自己不是很理解 但是时间紧急先记住 把算法理清)

在这里插入图片描述在这里插入图片描述
在这里插入图片描述
这里看不明白的可以看下面的演算过程 X并不代表通常数字计算的那种意义
在这里插入图片描述
在这里插入图片描述

#include<iostream>

using namespace std;

int main()
{
    
    
	int n,r[100];//矩阵个数 矩阵大小 r1 r2 r3 …rn r(n+1)
	int m[100][100],com[100][100];
	int i,j,t;//for循环变量 
    printf("How many matrixes:");
	scanf("%d",&n);
    printf("How size every matrixe:");
    for(i=1;i<=n+1;i++)
		scanf("%d",&r[i]);
	//初始化数组com和m
	for (i=1;i<=n;i++){
    
    
        for (j=1;j<=n;j++)    
			com[i][j]=0;}
	for (i=1;i<n;i++){
    
        //因为需要保证i+1<=n  所以i<n 
		m[i][i]=0;  //m(i)(i)=0
        m[i][i+1]= r[i]*r[i+1]*r[i+2];     // m(i)(i+1)
        com[i][i+1] = i;//
    }
	m[n][n]= 0;//情况补足
	//动态规划过程 j-i>=2时 例如m13 
	for ( int s =2; s<=n-1; s++){
    
    //i+s<=n  min(i)=1 s<=n-1 
    	for (i=1;i<n-s+1;i++){
    
      //mij i的范围 <=n+1-s 
			j=i+s;//mij j=i+s
			m[i][j] =m[i][i] +m[i+1][j] + r[i]*r[i+1]*r[j+1]; //通式代入 k=i时  
            com[i][j] = i;//记录最小次数时的k值 
            for (int k=i+1;k<j;k++){
    
    //k<j  若为j则出现 r[i]*r[j+1]*r[j+1]   
				t=m[i][k]+m[k+1][j]+ r[i]*r[k+1]*r[j+1];//通式代入 
                if (t <m[i][j]){
    
     //所算次数小于当前记录的最小次数 
					m[i][j] = t; //更新当前记录的最小次数 
					com[i][j]= k;//记录此时的k值情况 
				}     
			}	
        }
	
	} 
	printf("The least  calculate  quantity:%d",m[1][n]);//最终所要求的结果 
	for (i=1;i<=n;i++){
    
       
		printf("\n");          
        for (j=1;j<=n;j++)
			printf("%d",com[i][j]);//输出k值记录矩阵 
   }
}

猜你喜欢

转载自blog.csdn.net/weixin_44916213/article/details/112336173