Explorar el Código

矩阵连乘链

爱玲姐姐 hace 5 años
padre
commit
792c9ae7c6
Se han modificado 1 ficheros con 29 adiciones y 21 borrados
  1. 29 21
      C.cpp

+ 29 - 21
C.cpp

@@ -1,28 +1,36 @@
 #include<bits/stdc++.h>
+ 
 using namespace std;
-int main(){
+const int MAXN = 100;
+int m[MAXN][MAXN];
  
-        int n;
-        while(cin>>n){
-        int a[n],h[n];
-        int len = 0;
-        int x;
-        while(n--){
-                scanf("%d",&x);
-            a[len++] = x;
-        };
-        reverse(a,a+len);
-        int top = 0;
-        h[top] = a[0];
-        for(int i = 1; i < len; i++){
-            if(a[i] >= h[top]){
-                h[++top] = a[i];
-            }else{
-                int j=lower_bound(h,h+top,a[i])-h;
-                h[j]=a[i];
+void dp_chains(vector<int> p) {
+    int n = p.size() - 1;
+    for (int i = 1; i <= n; i++)m[i][i] = 0;
+    for (int l = 2; l <= n; l++)
+        for (int i = 1; i <= n - l + 1; i++) {
+            int j = i + l - 1;
+            m[i][j] = INT_MAX >> 2;
+            for (int k = i; k <= j - 1; k++) {
+                int q = m[i][k] + m[k + 1][j] + p[i - 1] * p[k] * p[j];
+                m[i][j] = min(q, m[i][j]);
             }
         }
-        printf("%d\n",top+1);
  
-        }
+}
+ 
+int main() {
+    int n;
+    cin >> n;
+    vector<int> p(n + 1, 0);
+    for (int i = 0; i < n; i++) {
+        cin >> p[i] >> p[i + 1];
+    }
+ 
+    //recursive_chains(p, 1, n);
+    dp_chains(p);
+ 
+    cout << m[1][n] << endl;
+ 
+    return 0;
 }