1. 程式人生 > 其它 >演算法筆記 - 矩陣連乘問題 動態規劃

演算法筆記 - 矩陣連乘問題 動態規劃

技術標籤:演算法學習EOJ 1051dp矩陣連乘動態規劃

演算法筆記 - 矩陣連乘問題 動態規劃

Intro

  • 下午課上提到了矩陣連乘,這是個經典的動態規劃問題,複習一下。

  • 主要就是自底向上的思路,列舉每個區間,子問題的最優解最後得到整體最優解(注意列舉的常見寫法)。

  • 狀態轉移方程:

m ( i , j ) = { 0 i = j m i n i ≤ k < j { m ( i , k ) + m ( k + 1 , j ) + a i ( x ) ∗ a k ( y ) ∗ a j ( y ) } i < j m(i, j)=\begin{cases} & 0 & i=j \\ & min_{i \leq k < j} \{ m(i, k) + m(k+1, j) + a_i(x) * a_k(y) * a_j(y) \} & i < j \end{cases}

m(i,j)={0minik<j{m(i,k)+m(k+1,j)+ai(x)ak(y)aj(y)}i=ji<j

Code

//
// Created by jiangnanmax on 2020/12/25.
// @email [email protected]
//

#include <iostream>
#include <cstring>
#include <cmath>

using namespace std;

typedef long long int ll;
const int INF = 0x3f3f3f3f
; struct Matrix { int x; int y; }; Matrix matrix[50]; ll dp[50][50]; int main() { int N; cin>>N; while (N--) { int n; cin>>n; for (int i = 0; i < n; i++) { cin>>matrix[i].x>>matrix[i].y; } memset(dp, INF,
sizeof(dp)); for (int i = 0; i < n; i++) { dp[i][i] = 0; } for (int len = 1; len < n; len++) { for (int i = 0; i + len < n ; i++) { int j = i + len; for (int k = i; k < j; k++) { dp[i][j] = min(dp[i][j], dp[i][k] + dp[k+1][j] + matrix[i].x * matrix[k].y * matrix[j].y); } } } cout<<dp[0][n-1]<<endl; } return 0; }