zoukankan      html  css  js  c++  java
  • tyvj1198 最优矩阵连乘

    描述

       一个n*m矩阵由n行m列共n*m个数排列而成。两个矩阵A和B可以相乘当且仅当A的列数等于B的行数。一个N*M的矩阵乘以一个M*P的矩阵等于一个N*P的矩阵,运算量为nmp。
       矩阵乘法满足结合律,A*B*C可以表示成(A*B)*C或者是A*(B*C),两者的运算量却不同。例如当A=2*3 B=3*4 C=4*5时,(A*B)*C=64而A*(B*C)=90。显然第一种顺序节省运算量。
       现在给出N个矩阵,并输入N+1个数,第i个矩阵是a[i-1]*a[i]

    输入格式

    第一行n(n<=100)
    第二行n+1个数

    输出格式

    最优的运算量

    测试样例1

    输入


    2 3 4 5

    输出

    64
    #include<iostream>
    #include<cstdio>
    #include<string>
    #include<cstring>
    #include<algorithm>
    #include<vector>
    using namespace std;
    const long long maxn = 105,maxint = 98765432123456L;
    long long n,a[maxn],f[maxn][maxn];
    int main(){
        cin>>n;
        for(int i = 1;i <= n+1;i++){
            cin>>a[i];
        }
        for(int i = 1;i <= n+1;i++){
            for(int j = 1;j <= n+1;j++){
                f[i][j] = maxint;
            }
        }
        long long j,tmp;
        for(int l = 3;l <= n+1;l++){
            for(int i = 1;i <= n-1;i++){
                j = i + l - 1;
                for(int k = i + 1;k <= j-1;k++){
                    tmp = a[i] * a[k] * a[j];
                    if(k - i >= 2) tmp += f[i][k];
                    if(j - k >= 2) tmp += f[k][j];
                    f[i][j] = min(f[i][j],tmp);
                }
            }
        }
        cout<<f[1][n+1];
        return 0;
    }
  • 相关阅读:
    CBV进阶(一)
    uva 11748 Rigging Elections
    uva 11573 Ocean Currents(bfs+优先队列)
    无向图的欧拉路
    poj 3254 Corn Fields
    hdu 1114
    hdu 2639 (第k小的01背包)
    uva 1347 tour
    uva 437 The Tower of Babylon
    uva 1025 A Spy in the Metro(动态规划)
  • 原文地址:https://www.cnblogs.com/hyfer/p/5754649.html
Copyright © 2011-2022 走看看