矩阵连乘 动态规划

 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 }

 

posted @ 2017-09-21 20:42  Wally的博客  阅读(188)  评论(0编辑  收藏  举报