UVa 348 - Optimal Array Multiplication Sequence

题目:矩阵连乘,求最小运算次数,输出运算优先级(用括号给出)。

分析:dp,区间动态规划。

状态:设DP[ l ][ s ]为以 s 开始长度为 l 的区间的 矩阵乘积的最小值;

阶段:区间长度;

决策:DP[ l ][ s ] = min(DP[ k ][ s ] + DP[ l-k ][ s+k ] + 乘法代价){ 1<k<l };

记录每一步运算的位置,递归输出计算方式即可。

说明:zoj1276(2011-09-19 01:38)。

#include <iostream>
#include <cstdlib>
#include <cstring>

using namespace std;

struct node
{
    int R,C;
}X[ 11 ];

int DP[ 11 ][ 12 ];
int DI[ 11 ][ 12 ];

void print( int l, int s )
{
    if ( l > 1 ) {
        cout << "(";
        print( DI[ l ][ s ], s );
        cout << " x ";
        print( l-DI[ l ][ s ], s+DI[ l ][ s ] );
        cout << ")";
    }else cout << "A" << s;
}

int main()
{
    int n,t = 1;
    while ( cin >> n && n ) {
        for ( int i = 1 ; i <= n ; ++ i )
            cin >> X[ i ].R >> X[ i ].C;

        memset( DP, 0, sizeof( DP ) );
        for ( int l = 2 ; l <= n ; ++ l )
        for ( int s = 1 ; s+l-1 <= n ; ++ s ) {
            DP[ l ][ s ] = 0xffffff;
            for ( int k = 1 ; k < l ; ++ k ) {
                int Temp = DP[ k ][ s ] + DP[ l-k ][ s+k ] + X[ s ].R*X[ s+k ].R*X[ s+l-1 ].C;
                if ( DP[ l ][ s ] > Temp ) {
                    DP[ l ][ s ] = Temp;
                    DI[ l ][ s ] = k;
                }
            }
        }
        //cout << DP[ n ][ 1 ] << endl;
        cout << "Case " << t ++ << ": ";
        print( n, 1 );
        cout << endl;
    }
}
时间: 2024-10-25 11:47:45

UVa 348 - Optimal Array Multiplication Sequence的相关文章

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

UVAoj 348 - Optimal Array Multiplication Sequence

1 /* 2 题意:矩阵相乘的最少的步数 3 dp[i][j]=min(dp[i][j], dp[i][k]+dp[k+1][j]+num[i-1]*num[k]*num[j]); 4 表示的是第i个矩阵到第j个矩阵相乘的最少步数 5 sign[i][j]表示的是第i个矩阵到第j个矩阵相乘的最少步数是由第i个矩阵到第sign[i][j]个矩阵相乘最少步数 6 和第sign[i][j]+1个矩阵到第j个矩阵相乘最少步数的得到的最小值! 7 */ 8 #include<iostream> 9 #i

uva 3485 Optimal Array Multiplication Sequence

题目: I - Optimal Array Multiplication Sequence Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submit Status Practice UVA 348 Description Given two arrays A and B, we can determine the array C = AB using the standard definition 

UVA 348 &amp; ZOJ 1276 Optimal Array Multiplication Sequence(dp , 矩阵链相乘问题)

Optimal Array Multiplication Sequence Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Description Given two arrays A and B, we can determine the array C = AB using the standard definition of matrix multiplication: The number of

矩阵连乘积 ZOJ 1276 Optimal Array Multiplication Sequence

题目传送门 1 /* 2 题意:加上适当的括号,改变计算顺序使得总的计算次数最少 3 矩阵连乘积问题,DP解决:状态转移方程: 4 dp[i][j] = min (dp[i][k] + dp[k+1][j] + p[i-1] * p[k] * p[j]) (i<=k<j) 5 s[i][j] 记录断开的地方(即加括号的位置),回溯法输出结果 6 */ 7 #include <cstdio> 8 #include <cstring> 9 #include <stri

AYITACM2016省赛第三周I - Optimal Array Multiplication Sequence(dp)

矩阵最少乘法 题意: 给你2个矩阵A.B,我们使用标准的矩阵相乘定义C=AB如下: A阵列中栏(column)的数目一定要等于B阵列中列(row)的数目才可以做此2阵列的相乘.若我们以rows(A),columns(A)分别代表A阵列中列及栏的数目,要计算C阵列共需要的乘法的数目为:rows(A)*columns(B)*columns(A).例如:A阵列是一个10x20的矩阵,B阵列是个20x15的矩阵,那么要算出C阵列需要做10*15*20,也就是3000次乘法. 要计算超过2个以上的矩阵相乘

UVA - 348Optimal Array Multiplication Sequence(递推)

题目:Optimal Array Multiplication Sequence 题目大意:给出N个矩阵相乘,求这些矩阵相乘乘法次数最少的顺序. 解题思路:矩阵相乘不满足交换率但满足结合率.dp[i][j] 代表第1个矩阵到第j个矩阵之间的最少的乘法次数,转移状态方程:dp[i][j] = Min(dp[i][k] + dp[k + 1][j]  + A[i - 1] * A[k] *A[j]) k>= i && k <= j - 1.A0A1A2A3..Ak  |  Ak+1

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

UVA 348 矩阵链乘

UVA 348 题意: 给出 N 个矩阵(A1,A2,...,An),求完全括号化方案,使得计算乘积(A1A2...An)所需乘法次数最少.并输出方案. 解题: 算法导论是个好东西   讲的很详细~ 假设矩阵 A 和 B 相乘,那 A 的列数必须要和 B 的行数相同,即 若 A 的行列数为(x,y),则 B 须为(y,z), 它们相乘得到一个(x,z)的矩阵:需要乘 xyz 次.题目把相乘的顺序给出了,我们做的就是添加括号了.把所有矩阵用一个序列 P 表示,第 i 个矩阵的行列数为 P(i-1)