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;
}
时间: 2024-10-23 21:17:56

tyvj1198 最优矩阵连乘的相关文章

Uva 10003 Cutting Sticks (类似于最优矩阵连乘的dp)

题意:有一根长度为L的木棍,和n个切割点的位置(按照从小到大排序),你的任务是在这些切割点的位置把棍子切成n+1份,使得总切割费用最小.每次切割的费用等于被切的木棍长度 思路:这道题与最优矩阵连乘的思想一样,那就是分析最优子结构,再根据子结构来定义状态,首先我们假定第一次分割的最优方案是在k处分割,得到0~k与k~L两段木棍,那么如何最优分割0~k与0~L就是它的子问题,我们根据子问题定义状态d(i,j)是分割从割点i到割点j的最优方案,状态转移方程 d(i,j)=min{d(i,k)+d(k,

POJ1651:Multiplication Puzzle(区间DP 最优矩阵链乘)

题意:除了头尾不能动,每次取出一个数字,这个数字与左右相邻数字的乘积为其价值,最后将所有价值加起来,要求最小值 和最优矩阵链乘模型一样,最后取出的数决定了序,如果没学过最优矩阵连乘找重复子问题还是比较难找的 DP //180K 0MS #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; int dp[110][110];

uva348 最优矩阵链乘 经典区间dp

// uva348 最优矩阵链乘 // 典型的区间dp // dp[i][j] 表示矩阵i到j链乘所得到的最小花费 // dp[i][j] = min(dp[i][k]+dp[k+1][j]+a[i].pl*a[k].pr*a[j].pr); // 在区间i到j上找一个k使得dp[i][k]+dp[k+1][j]这两部分的和在加上最后的 // a[i].pl*a[k].pr*p[i].pr的最小值; // 能有这样的状态关键是; P =A[1] * A[2] * .... * A[K] // 和

uva348Optimal Array Multiplication Sequence (最优矩阵链乘+路径输出)

Optimal Array Multiplication Sequence Time Limit:3000MS Memory Limit:0KB 64bit IO Format:%lld & %llu Submit Status Practice UVA 348 Appoint description: Description Download as PDF Given two arrays A and B, we can determine the array C = AB using the

最优矩阵链乘

主要大区间化为小区间…… 先小区间求值…… 状态转移方程 f(i,j) = min{ f(i,k) + f(k+1,j) + p[i-1]p[k]p[j] }; poj 1651 http://poj.org/problem?id=1651 #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include

dp-最优矩阵链乘

来自于紫书 题目大意 有\(n\)个矩阵组成的序列,设计一种运算顺序把它们依次乘起来,使得总运算量最小.假设第i个矩阵\(A_i\)是\(P_{i-1} \times P_i\)的.(\(n<=100\)) 例如:假设\(A\).\(B\).\(C\)分别是\(1 \times 50 , 50 \times 20 , 20 \times 5\) \(A \times (B \times C)\)的运算量为\(1 \times 50 \times 5 + (50 \times 20 \times

poj1651 最优矩阵乘法动态规划解题

题目描述: 有若干个矩阵{Ai},元素都为整数且已知矩阵大小. 如果要计算所有矩阵的乘积A1 * A2 * A3 .. Am,最少要多少次整数乘法? 输入 第一行一个整数n(n <= 100),表示一共有n-1个矩阵.第二行n个整数B1, B2, B3... Bn(Bi <= 100),第i个数Bi表示第i个矩阵的行数和第i-1个矩阵的列数.等价地,可以认为第j个矩阵Aj(1 <= j <= n - 1)的行数为Bj,列数为Bj+1. 输出 一个整数,表示最少所需的乘法次数 采用动

UVA 348 Optimal Array Multiplication Sequence(最优矩阵链乘)

L - Optimal Array Multiplication Sequence Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submit Status Practice UVA 348 Appoint description:  acmparand  (2013-08-02)System Crawler  (2015-08-04) Description Given two arrays A a

1629 - Cake slicing(DP)

花了近2个小时终于AC,好爽.. 一道类似于最优矩阵链乘的题目,受<切木棍>那道题的启示,该题的原理也是一样的,仅仅只是变成了且面积.那么对应的也要添加维度 . 显然要完整的表示状态,最少要用四维数组.分别表示它的两个对角线顶点的坐标 .   然后横切或者纵切,递归需找更小的矩形,直到矩形内仅仅剩一个樱桃的时候返回0 那么问题就是如何高速的推断一个矩形内有多少个樱桃,于是决定再开一个数组记录这个矩形内樱桃的个数.一開始就是在这个地方超时(开了个五重循环) ,后来想到一个折中的办法,将时间复杂度