POJ 1651 Multiplication Puzzle

  题目大意:有一个正整数序列,从中间(不是第一个数和最后一个数)拿出一个数,可以得到一个分值,分值计算规则为:这个数乘以它左边的数和它右边的数。重复以上步骤,直至剩下第一个数和最后一个数,计算可以得到的最小分值。

  实际上是矩阵链乘问题的另一种表述方式,很不错的题,开始的时候一点没看出来,网上搜素时别人直接说是矩阵链乘,一想还真是,完全是按这个模型构造的问题啊

 1 #include <cstdio>
 2 #include <climits>
 3 #define MAXN 110
 4 
 5 int p[MAXN], m[MAXN][MAXN];
 6 
 7 int main()
 8 {
 9 #ifdef LOCAL
10     freopen("in", "r", stdin);
11 #endif
12     int N;
13     while (scanf("%d", &N) != EOF)
14     {
15         int n = N - 1;    // n is the number of matrixes
16         for (int i = 0; i <= n; i++)   scanf("%d", &p[i]);
17         for (int i = 1; i <= n; i++)   m[i][i] = 0;    
18         for (int l = 2; l <= n; l++)
19         {
20             for (int i = 1; i <= n-l+1; i++)
21             {
22                 int j = i+l-1;
23                 m[i][j] = INT_MAX;
24                 for ( int k = i; k <= j-1; k++)
25                 {
26                     int q = m[i][k] + m[k+1][j] + p[i-1]*p[k]*p[j];
27                     if (q < m[i][j])   m[i][j] = q;
28                 }
29             }
30         }
31         printf("%d
", m[1][n]);
32     }
33     return 0;
34 }
View Code
原文地址:https://www.cnblogs.com/xiaobaibuhei/p/3179836.html