Nearth==>动态规划算法001/矩阵连乘算法
程序员文章站
2022-07-03 16:33:58
...
运行效果:
代码学习:
/* 为了便于理解,给出如下具体数据便于说明 A1:10*20 A2: 20*30 A3:30*40 A4: 40*50 r=1:A1,A2,A3,A4. r=2:A1A2,A2A3,A3A4. r=3:A1A2A3,A2A3A4. r=4:A1A2A3A4. */ #include<iostream> using namespace std; #define MAX 100 int p[MAX]={0}; int m[MAX][MAX]={0}; int s[MAX][MAX]={0};//初始化数组 int n; void matrixChain(){ int i,r,j,k; for(int r=2;r<=n;r++){//r:矩阵连乘规模-->r=2,3,4 for(i=1;i<=n-r+1;i++){//i=1,2,3-i=1,2-i=1-->断链位置 j=i+r-1;//j:代表链长长度,若r=2,i=1;则j=2;若r=2,i=2,则j=3;若r=2,i=3,则j=4; m[i][j]=m[i+1][j]+p[i-1]*p[i]*p[j];//对m[1][2],m[1][3],m[1][4]赋值 s[i][j]=i; for(k=i+1;k<j;k++){//若i=1,j=2,则k=2 int temp=m[i][k]+m[k+1][j]+p[i-1]*p[k]*p[j]; if(temp<m[i][j]){ m[i][j]=temp; s[i][j]=k; } } } } } void print(int i,int j){ if(i==j){ cout<<"A["<<i<<"]"; return; } cout<<"("; print(i,s[i][j]); print(s[i][j]+1,j); cout<<")"; } int main(){ cout<<"注意:请学习了矩阵连乘的理论再来输入数据测试·····"<<endl; cout<<"************矩阵连乘算法************"<<endl; cout<<"____________________________________"<<endl; int k=1; while(k<=3){ cout<<"第"<<k<<"次测试:"<<endl; cout<<"------------------------------------"<<endl; cout<<"请输入矩阵的个数n:"; cin>>n; int i; cout<<"请依次输入每个矩阵的行数和列数:"<<endl; for(i=0;i<n;i++){ cout<<"第"<<i+1<<"矩阵的行数:"; cin>>p[i]; cout<<"第"<<i+1<<"矩阵的列数:"; cin>>p[i+1]; cout<<"-----------------------------"<<endl; } matrixChain(); print(1,n); cout<<endl; cout<<"矩阵连乘最小数乘次数:"<<m[1][n]<<endl; cout<<"&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&"<<endl; k++; } return 0; }
上一篇: Vue组件间传值
下一篇: 矩阵连乘(动态规划算法)