|
@@ -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;
|
|
|
}
|