矩阵连乘问题

Posted kerman

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了矩阵连乘问题相关的知识,希望对你有一定的参考价值。

今天这题困扰了我好久,本来以为是自己dp写错了,结果wa了好多次以后发现原来是自己的处理输入这块出现了不知名的bug,所以干脆直接用结构体存了!!!

 

 

思路:动态规划的典型问题,将矩阵连乘积AiAi-1...Aj简记为A[i:j] ,i≤j  。

考察计算A[i:j]的最优计算次序。设这个计算次序在矩阵Ak和Ak+1之间将矩阵链断开,i≤k<j,则其相应完全加括号方式为:

(AiAi+1...Ak)(Ak+1Ak+2...Aj)

令m[i:j]为最优解,则m[i:k]和m[k+1:j]则为A[i:k]和A[k+1:j]的最优解,以此递归这得递归式:

技术分享图片

代码如下:

 1 #include<iostream>
 2 #include<cstring>
 3 #include<algorithm>
 4 #include<vector>
 5 #define INF 999999999
 6 
 7 using namespace std;
 8 
 9 struct M
10 {
11     int x;
12     int y;    
13 }m[1010];
14 
15 int dp[1010][1010];
16 int solve(int n)
17 {
18     memset(dp,0,sizeof(dp));
19     for (int len = 2; len <= n; len++)
20     {
21         for(int i=1; i<=n-len+1; i++)
22         {
23             int j = i+len-1;
24             dp[i][j] = dp[i+1][j] + m[i-1].x*m[i-1].y*m[j-1].y;
25             for (int k = i+1; k < j; k++)
26             {
27                 int count = dp[i][k] + dp[k+1][j] + m[i-1].x*m[k-1].y*m[j-1].y;
28                 if (count < dp[i][j])
29                     dp[i][j] = count;
30             }
31         }
32     }
33     return dp[1][n];
34 }
35 int main()
36 {
37     int n;
38     while(cin>>n)
39     {
40         bool falg=false;
41         for(int i=0; i<n; i++)
42         {
43             cin>>m[i].x>>m[i].y;
44         }
45         for(int i=0; i<n-1; i++)
46         {
47             if(m[i].y != m[i+1].x)
48             {
49                 falg = true;
50                 break;
51             }
52         }
53         if(!falg)
54         {
55             cout<<solve(n)<<endl;
56         }
57         else
58             cout<<"invalid argument"<<endl;
59         
60     }
61     return 0;
62 }

 

以上是关于矩阵连乘问题的主要内容,如果未能解决你的问题,请参考以下文章

矩阵连乘问题(动态规划算法)

动态规划:矩阵连乘问题

矩阵连乘问题

矩阵乘法——连乘中的数学问题

动态规划-矩阵连乘问题

矩阵连乘最优解---动态规划