zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    实线矢量元素提取
    matlab写txt文件
    matlab之boundary()函数
    matlab之flipud()函数
    matlab unique()函数
    KD-tree
    matlab之细胞数组
    matlab的代码注释
    matlab中的try...catch...end
    (转)MySQL 加锁处理分析
  • 原文地址:https://www.cnblogs.com/xiaobaibuhei/p/3179836.html
Copyright © 2011-2022 走看看