矩阵连乘

    科技2025-06-17  9

    dp: 

    #include<iostream> #include<vector> #include <climits> #include <cfloat> #include<iomanip> using namespace std; void dp(vector<vector<int>>& m, vector<vector<int>>& s,vector<int>&p) { int n = m.size() - 1; int j, min, t; for (int i = 1; i < m.size(); i++) m[i][i] = 0; for (int r = 2; r <= n; r++) { for (int i = 1; i <= n - r + 1; i++) { j = i + r - 1; m[i][j] = m[i + 1][j] + p[i - 1] * p[i] * p[j]; s[i][j] = i; for (int k = i + 1; k < j; k++) { t= m[i][k] + m[k + 1][j] + p[i - 1] * p[k] * p[j]; if (m[i][j] >t) { m[i][j]=t; s[i][j] = k; } } } } } void visit(vector<vector<int>>& m,int n) { for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) cout << setw(5)<<m[i][j] << ' '; cout << endl; } } int main() { int n = 6; vector<vector<int>>m(n+1, vector<int>(n+1)); vector<vector<int>>s(n+1, vector<int>(n+1)); vector<int>p(n + 1); int a[7] = { 30,35,15,5,10,20,25 }; for (int i = 0; i <= n; i++) p[i] =a[i] ; dp(m, s, p); cout << "-------" << endl; cout << "m:" << endl; visit(m,n); cout << "------" << endl; cout << "s:" << endl; visit(s,n); return 0; }

    备忘录方法:

    int lookupchain(int i, int j,vector<vector<int>>&s, vector<vector<int>>& m,vector<int>&p) { if (i==j) return 0; if (m[i][j] > 0) return m[i][j]; int u = lookupchain(i+1,j,s,m,p) + p[i - 1] * p[i] * p[j]; s[i][j] = i; for (int k=i+1; k < j; k++) { int t = lookupchain(i,k, s, m, p) + lookupchain(k+1,j, s, m, p) + p[i - 1] * p[k] * p[j]; if (t < u) { u = t; s[i][j] = k; } } m[i][j] = u; return u; } void MemorizesdMatrix(int n, vector<vector<int>>& m, vector<vector<int>>& s, vector<int>& p) { for (int i = 1; i <= n; i++) for (int j = 1; j <= n; j++) { m[i][j] = 0; s[i][j] = 0; } int min = lookupchain(1, n, s, m, p); cout << min << endl; }

     

    Processed: 0.016, SQL: 8