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个以上的矩阵相乘就得决定要用怎样的顺序来做。例如:X、Y、Z都是矩阵,要计算XYZ的话可以有2种选择:(XY)Z 或者X(YZ)。假设X是5x10的阵列,Y是10x20的阵列,Z是20x35的阵列,那个不同的运算顺序所需的乘法数会有不同:

(XY)Z

  • 5*20*10 = 1000次乘法完成(XY),并得到一5x20的阵列。
  • 5*35*20 = 3500次乘法得到最后的结果。
  • 总共需要的乘法的次数:1000+3500=4500。

X(YZ)

  • 10*35*20 = 7000次乘法完成(YZ),并得到一10x35的阵列。
  • 5*35*10 = 1750次乘法得到最后的结果。
  • 总共需要的乘法的次数:7000+1750=8750。

很明显的,我们可以知道计算(XY)Z会使用较少次的乘法。

这个问题是:给你一些矩阵,你要写一个程式来决定该如何相乘的顺序,使得用到乘法的次数会最少。

思路:最优矩阵链乘问题,典型的动态规划题目。

#include<stdio.h>
#define m 1000
#define inf 0x3f3f3f3f
int dp[m][m],s[m][m],p[m],n;
void print(int i,int j)//递归输出所有的结果
{
    if(i==j)
        printf("A%d",i); //输出是第几个数据
    else
    {
        printf("(");
        print(i,s[i][j]);//递归下一个数据
        printf(" x ");
        print(s[i][j]+1,j);
        printf(")");
    }
}
void work()
{
    int i,j,k,l,t;
    for(i=1; i<=n; i++)
        dp[i][i]=0;//首先初始化为0
    for(l=2; l<=n; l++)
        for(i=1; i<=n-l+1; i++)
        {
            j=i+l-1;         //判断i和j之间的最优解
            dp[i][j]=inf;
            for(k=i; k<=j-1; k++)
            {
                t=dp[i][k]+dp[k+1][j]+p[i-1]*p[k]*p[j];
                if(t<dp[i][j])
                {
                    dp[i][j]=t;  //保持最优解
                    s[i][j]=k; //记录需要加括号的地方
                }
            }
        }
    print(1,n); //输出i和j之间的最优解
   puts("");
}
int main()
{
    int c=1,i;
    while(scanf("%d",&n)&&n)
    {
        for(i=1; i<=n; i++)
            scanf("%d%d",&p[i-1],&p[i]);//输入数据
        printf("Case %d: ",c++);
        work();
    }
    return 0;
}
时间: 2024-12-08 09:08:28

AYITACM2016省赛第三周I - Optimal Array Multiplication Sequence(dp)的相关文章

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

AYITACM2016省赛第三周 L - Anniversary party(树形dp)

Description There is going to be a party to celebrate the 80-th Anniversary of the Ural State University. The University has a hierarchical structure of employees. It means that the supervisor relation forms a tree rooted at the rector V. E. Tretyako

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 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

矩阵连乘积 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

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 

AYITACM2016省赛第三周M - Beijing Guards(贪心+二分)

Beijing was once surrounded by four rings of city walls: the Forbidden City Wall, the Imperial City Wall, the Inner City Wall, and ?nally the Outer City Wall. Most of these walls were demolished in the 50s and 60s to make way for roads. The walls wer

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>

第二第三周暑期集训总结

##第二第三周暑期集训总结在第二第三周中,我主要看了状压DP,数位DP,树状DP的主要内容.同时,在做训练赛的过程中,发现一些知识点掌握的不好,于是又回头复习了一下,包括图的一些基本概念,最短路算法,并查集,最小生成树,图的存储方法(矩阵,邻接表(数组)).还有很关键的一件事就是参加了今年的CCPC网络选拔赛.####状压DP刚开始看的时候,我觉得状压DP很难.在恶补了位运算的知识后,我又自己敲了一遍代码,突然有一种茅塞顿开的感觉.这是我对状压DP的理解:状压DP其实也没什么深奥的,就是利用位运