矩阵链乘法 poj 1651 递归和迭代两种方法
1 #define INF 0xffffff 2 int m[102][102],p[102],q,i,j,n,l; 3 int lookup(int i,int j) 4 { 5 int k; 6 if(m[i][j]<INF) return m[i][j]; 7 if(i==j)m[i][j]=0; 8 else 9 for(k=i;k<=j-1;k++) 10 { 11 q=lookup(i,k)+lookup(k+1,j)+p[i-1]*p[k]*p[j]; 12 if(q<m[i][j])m[i][j]=q; 13 } 14 return m[i][j]; 15 } 16 main() 17 { 18 while(~scanf("%d",&n)) 19 { 20 for(i=0;i<n;i++)scanf("%d",&p[i]); 21 n--; 22 for(i=1;i<=n;i++) 23 for(j=i;j<=n;j++) 24 m[i][j]=INF; 25 printf("%d\n",lookup(1,n)); 26 } 27 }
1 #define INF 0xffffff 2 main() 3 { 4 int n,s[102][102],m[102][102],i,j,k,l,p[102],q; 5 while(~scanf("%d",&n)) 6 { 7 for(i=0;i<n;i++)scanf("%d",&p[i]); 8 n--; 9 for(i=1;i<=n;i++)m[i][i]=0; 10 for(l=2;l<=n;l++) 11 { 12 for(i=1;i<=n-l+1;i++) 13 { 14 j=i+l-1; 15 m[i][j]=INF; 16 for(k=i;k<=j-1;k++) 17 { 18 q=m[i][k]+m[k+1][j]+p[i-1]*p[k]*p[j]; 19 if(q<m[i][j])m[i][j]=q,s[i][j]=k; 20 } 21 } 22 } 23 printf("%d\n",m[1][n]); 24 } 25 }