动态规划--矩阵链乘法

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 #define MAXN 1000000
 4 void Matrix_Chain_Order(int * p, int * s, int N)
 5 {
 6        int n = N - 1;
 7        int m[N][N];
 8        for(int i = 1; i <= n; i++)
 9        {
10              m[i][i] = 0;          
11        }   
12        for(int l = 2; l <= n; l++) /*l是链的长度*/
13        {
14                for(int i = 1; i <= n - l + 1; i++)
15                {
16                     int j = i + l - 1;
17                     m[i][j] = MAXN;       
18                     int q; 
19                     for(int k = i; k <= j - 1; k++)
20                     {
21                          q = m[i][k] + m[k + 1][j] + p[i - 1] * p[k] * p[j];
22                          if(q < m[i][j])
23                          {
24                               m[i][j] = q;
25                               *(s + i * N + j) = k;     
26                          }           
27                     }     
28                }             
29        }      
30 }
31 
32 void Print_Optimal_Parens(int * s, int i, int j, int N)
33 {
34      if(i == j)
35      {
36           printf("A%d",i);     
37      }     
38      else
39      {
40          printf("(");
41          Print_Optimal_Parens((int *)s, i, *(s + i * N + j), N);
42          Print_Optimal_Parens((int *)s,  *(s + i * N + j)+1, j, N);
43          printf(")");    
44      }
45 }
46 
47 int main()
48 {
49     int P[7] = {30,35,15,5,10,20,25};
50     int S[7][7];
51     Matrix_Chain_Order(P,(int *)S,7);
52     Print_Optimal_Parens((int *)S,1,6,7);
53     system("pause");
54     return 0;    
55 } 
posted @ 2012-11-25 18:39  缓冲区溢出  阅读(307)  评论(0编辑  收藏  举报