矩陣連乘問題
問題描述:給定一組可以連乘的矩陣,求最佳相乘順序,使得總的計算次數最少。
動態規劃演算法:
#include <stdio.h>
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("A[%d][%d] and A[%d][%d]\n",i,s[i][j],s[i][j]+1,j);
}
int main()
{
int n,i,j,k,r;
int *p;
int **m, **s;
printf("please input the number of matrix:");
scanf("%d",&n);
p=new int[n+1];
m=new int *[n+1];
s=new int *[n+1];
for(i=0;i<n+1;i++)
{
m[i]=new int[n+1];
s[i]=new int[n+1];
}
printf("input the dimensions of all matrix:");
for(i=0;i<n+1;i++)
scanf("%d", p+i);
for(i=1;i<n+1;i++)
m[i][i]=0;
for(r=2;r<=n;r++)
{
for(i=1;i<=n+1-r;i++)//運算的開始位置
{
j=i+r-1;
m[i][j]=m[i+1][j]+p[i-1]*p[i]*p[j];
s[i][j]=i;
for(k=i+1;k<j;k++){
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;
}
}
}
}
//printf("\n%d\n",m[1][n]);
traceback(1,n,s);
return 0;
}
遞迴演算法:
#include <stdio.h>
int **s,*p;
int recurMatrix(int i, int j)
{
int u,k;
if (i==j)
u=0;
else
{
u=recurMatrix(i,i)+recurMatrix(i+1,j)+p[i-1]*p[i]*p[j];
s[i][j]=i;
for(k=i+1;k<j;k++)
{
int temp=recurMatrix(i,k)+recurMatrix(k+1,j)+p[i-1]*p[k]*p[j];
if(temp<u)
{
s[i][j]=k;
u=temp;
}
}
}
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("A[%d][%d] and A[%d][%d]\n",i,s[i][j],s[i][j]+1,j);
}
int main()
{
int n,i,j,k,r;
int **m;
printf("please input the number of matrix:");
scanf("%d",&n);
p=new int[n+1];
m=new int *[n+1];
s=new int *[n+1];
for(i=0;i<n+1;i++)
{
m[i]=new int[n+1];
s[i]=new int[n+1];
}
printf("input the dimensions of all matrix:");
for(i=0;i<n+1;i++)
scanf("%d", p+i);
printf("the total number is %d.\n",recurMatrix(1,n));
traceback(1,n,s);
return 0;
}
備忘錄演算法:
#include <stdio.h>
int **s,*p, **m;
int lookup(int i, int j)
{
int u,k, temp;
if(m[i][j]>0)
return m[i][j];
if(i==j)
u=0;
else{
u=lookup(i,i)+lookup(i+1,j)+p[i-1]*p[i]*p[j];
s[i][j]=i;
for(k=i+1;k<j;k++){
temp=lookup(i,k)+lookup(k+1,j)+p[i-1]*p[k]*p[j];
if(temp<u)
{
u=temp;
s[i][j]=k;
}
}
}
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("A[%d][%d] and A[%d][%d]\n",i,s[i][j],s[i][j]+1,j);
}
int main()
{
int n,i,j;
printf("please input the number of matrix:");
scanf("%d",&n);
p=new int[n+1];
m=new int *[n+1];
s=new int *[n+1];
for(i=0;i<n+1;i++)
{
m[i]=new int[n+1];
s[i]=new int[n+1];
}
//初始化
for(i=1;i<n+1;i++)
for(j=1;j<n+1;j++)
m[i][j]=0;
printf("input the dimensions of all matrix:");
for(i=0;i<n+1;i++)
scanf("%d", p+i);
printf("the total number is %d.\n",lookup(1,n));
traceback(1,n,s);
return 0;
}
相關文章
- 矩陣連乘矩陣
- 矩陣連乘問題 Python 動態規劃矩陣Python動態規劃
- hdu 1757 矩陣連乘矩陣
- 演算法題:矩陣鏈乘問題演算法矩陣
- 演算法題系列:矩陣鏈乘問題演算法矩陣
- 動態規劃&矩陣連乘動態規劃矩陣
- 矩陣連乘演算法精講矩陣演算法
- CUDA 版本矩陣乘矩陣
- NYOJ 1409 快速計算【矩陣連乘】矩陣
- 矩陣連乘(動態規劃演算法)矩陣動態規劃演算法
- 動態規劃_備忘錄法_矩陣鏈乘問題動態規劃矩陣
- poj 2778 AC自動機與矩陣連乘矩陣
- hdu2243 ac自動機+矩陣連乘矩陣
- CUDA版本稀疏矩陣向量乘矩陣
- OpenMP 版本稀疏矩陣向量乘矩陣
- 三維旋轉矩陣 左乘和右乘分析矩陣
- 【矩陣求導】關於點乘 (哈達瑪積)的矩陣求導矩陣求導點乘
- HDU 1588 斐波那契數列數列變形和矩陣連乘矩陣
- 利用瓊斯矩陣求解一般偏振問題矩陣
- matlab矩陣連線圖解Matlab矩陣圖解
- 大規模 Transformer 模型 8 位元矩陣乘簡介ORM模型矩陣
- 陣列累加和問題三連陣列
- 面試題:階乘問題面試題
- 生成螺旋矩陣(方陣、矩陣)矩陣
- 動態規劃6:臺階問題和矩陣最小路徑問題動態規劃矩陣
- 三維空間變換中旋轉矩陣左乘與右乘的區別矩陣
- 鄰接矩陣、度矩陣矩陣
- 巨大的矩陣(矩陣加速)矩陣
- OpenGL 矩陣變換相關連結矩陣
- lisp 習題 矩陣旋轉Lisp矩陣
- 奇異矩陣,非奇異矩陣,偽逆矩陣矩陣
- CF22B 最大子矩陣問題簡單版矩陣
- 矩陣類及其常規運算(加、減、乘、轉置、求逆、行列式、代數餘子式、伴隨矩陣)矩陣
- 矩陣矩陣
- 資料結構:陣列,稀疏矩陣,矩陣的壓縮。應用:矩陣的轉置,矩陣相乘資料結構陣列矩陣
- 每日一題@49矩陣置零每日一題矩陣
- 3D圖形:矩陣的行列式,矩陣的逆、正交矩陣、齊次矩陣3D矩陣
- 矩陣中最大的二維矩陣矩陣