矩阵连乘 动态规划
1 #include <iostream> 2 #include <bits/stdc++.h> 3 using namespace std; 4 int a[20],flag[20][20],s[20][20]; 5 void dfs(int l,int r) 6 { 7 if(l==r) 8 { 9 printf("%d",l); 10 return ; 11 } 12 printf("<"); 13 dfs(l,s[l][r]); 14 printf(","); 15 dfs(s[l][r]+1,r); 16 printf(">"); 17 } 18 int main() 19 { 20 int n; 21 while(~scanf("%d",&n)) 22 { 23 for(int i=0; i<=n; i++) 24 scanf("%d",&a[i]); 25 memset(flag,0,sizeof(flag)); 26 27 for(int i=1; i<n; i++) 28 { 29 for(int j=1; j+i<=n; j++) 30 { 31 flag[j][i+j]=flag[j+1][i+j]+a[j-1]*a[j]*a[i+j]; 32 s[j][i+j]=j; 33 for(int k=j+1; k<i+j; k++) 34 { 35 if(flag[j][i+j]>flag[j][k]+flag[k+1][i+j]+a[j-1]*a[k]*a[i+j]) 36 { 37 flag[j][i+j]=flag[j][k]+flag[k+1][i+j]+a[j-1]*a[k]*a[i+j]; 38 s[j][i+j]=k; 39 } 40 } 41 } 42 } 43 printf("这%d个矩阵的完全加括号以后最少的计算次数是%d\n",n,flag[1][n]); 44 printf("这%d个矩阵的完全加括号的方式为:",n); 45 dfs(1,n); 46 printf("\n"); 47 } 48 return 0; 49 }