tyvj 1198 矩阵连乘

题目描述

一个n*m矩阵由n行m列共n*m个数排列而成。两个矩阵A和B可以相乘当且仅当A的列数等于B的行数。一个N*M的矩阵乘以一个M*P的矩阵等于一个N*P的矩阵,运算量为n*m*p。 矩阵乘法满足结合律,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个数;

输出格式

最优的运算量

样例

样例输入

 3
 2 3 4 5

样例输出

 64

解释:

可能大部分同学连题目都没有看懂,其实是很好理解的。

如题目中的A、B、C,A*B=2*3*4,B*C=3*4*5。

可以这么理解:两个矩阵(长宽中必须有一个相同)相乘,讲相同部分放中间,剩下两个不同的部分在两边相乘。如:A:x*y

B:y*z

C:z*l

A*B=x*y*z; B*C=y*z*l;

那么三个矩阵相乘是什么样的呢?

还是按上面的例子:(A*B)*C=(x*y*z)*C,显然A*B后的矩阵长宽都发生了变化,变化的是:y的边去掉,x与z取相乘,则乘了后,矩阵变为了x*z

如图:

所以,则(A*B)*C=(x*y*z)+(x*z*l),A*(B*C)=(x*y*l)+(y*z*l)

注意:

题中求的是运算量,与矩阵相乘后的结果不一样,相乘后的结果只是用来求下一次相乘的运算量。

样例模拟:

a[i]与a[i+1]即第i个矩阵

A:2*3;B:3*4;C:4*5

(A*B)*C:2*3*4+2*4*5=64;

A*(B*C):2*3*5+3*4*5=90;

故最小的运算量=64

动态转移方程:

 f[i][j]=min(f[i][j],f[i][k]+f[k+1][j]+a[i-1]*a[j]*a[k]);

f[i][j]:从i到j的最小的运算量

f[i][j]之间分开,分成i到k与k+1到j两个区间,现在就可以看出是很简单区间dp,在将运算量加上,取最小值

代码:

#include<bits/stdc++.h>
using namespace std;
const int maxe=1e2+,maxn=1e2+,INF=0x3f3f3f3f;
int n,m,f[maxe][maxe],sum[maxn],a[maxn];
int main(){
cin>>n;
memset(f,0x3f,sizeof(f));//初始成最大去最小值
for(int i=;i<=n;i++)cin>>a[i];
for(int i=;i<=n+;i++)f[i][i]=;//相同之间的运算量为0
for(int d=;d<=n;d++){//枚举长度
for(int i=,j;(j=i+d-)<=n;i++){
for(int k=i;k<j;k++){
f[i][j]=min(f[i][j],f[i][k]+f[k+][j]+a[i-]*a[j]*a[k]);
}
}
}
cout<<f[][n]<<endl;//输出1到n的最小运算量
   return 0;
}

tyvj 1198 矩阵连乘——区间dp的更多相关文章

  1. 区间dp复习 之 tyvj 1198 矩阵连乘

    题目描述 一个\(n*m\)矩阵由\(n\)行\(m\)列共\(n*m\)个数排列而成.两个矩阵\(A\)和\(B\)可以相乘当且仅当\(A\)的列数等于\(B\)的行数.一个\(N*M\)的矩阵乘以 ...

  2. POJ 1651 Multiplication Puzzle(类似矩阵连乘 区间dp)

    传送门:http://poj.org/problem?id=1651 Multiplication Puzzle Time Limit: 1000MS   Memory Limit: 65536K T ...

  3. 蓝桥 ADV-232 算法提高 矩阵乘法 【区间DP】

      算法提高 矩阵乘法   时间限制:3.0s   内存限制:256.0MB      问题描述 有n个矩阵,大小分别为a0*a1, a1*a2, a2*a3, ..., a[n-1]*a[n],现要 ...

  4. 蓝桥杯:矩阵乘法(区间DP)

    http://lx.lanqiao.cn/problem.page?gpid=T417 题意:…… 思路:n=1000,一开始觉得区间DP会超时,后来想不到其他做法就这样做了,居然没超时. 状态转移: ...

  5. POJ1651 Multiplication Puzzle —— DP 最优矩阵链乘 区间DP

    题目链接:https://vjudge.net/problem/POJ-1651 Multiplication Puzzle Time Limit: 1000MS   Memory Limit: 65 ...

  6. 矩阵连乘 /// 区间DP oj1900

    题目大意: 输入t :t为测试用例个数 接下来t个测试 每个测试用例 第一行输入n: n为矩阵个数 保证n个矩阵依序是可乘的 接下来n行 每行输入p,q:p为长度q为宽度 对给定的n个矩阵确定一个计算 ...

  7. TYVJ P1078 删数 Label:区间dp

    描述 有N个不同的正整数数x1, x2, ... xN 排成一排,我们可以从左边或右边去掉连续的i个数(只能从两边删除数),1<=i<=n,剩下N-i个数,再把剩下的数按以上操作处理,直到 ...

  8. 算法提高 矩阵乘法 区间DP

    这是神题,n <= 1000,如果是极限数据普通的n^3区间DP怎么可能过?可偏偏就过了. 刘汝佳大哥的训练指南上面说的存在nlgn的算法解决矩阵链乘问题,可是百度都找不到.... AC代码 # ...

  9. [jdoj1090]矩阵_区间dp

    矩阵 jdoj-1910 题目大意:给你连续的n个矩阵的长和宽,保证每连续的两个相邻矩阵满足相乘的条件,不能改变题目中矩阵的位置,求将这些矩阵相乘为一个矩阵的最小乘法次数. 注释:1<=n< ...

随机推荐

  1. Windows10开启Ubuntu子系统并搭建Docker环境

    前言 很早就听说微软有个基于Ubuntu的子系统,一直也没机会尝试一下,之前也只是用VMware安装,但是还要单独安装软件,安装镜像,一点都不fit,所以就瞎折腾下(也是因为最近有空). 搭建Ubun ...

  2. 【JAVA习题二十九】809*??=8*??+9*??+1 其中??代表的两位数,8*??的结果为两位数,9*??的结果为3位数。求??代表的两位数,及809*??后的结果。

    package erase; public class 八九与问好两位数的乘积和 { public static void main(String[] args) { int m,n;//m十位,n个 ...

  3. Linux磁盘空间容量不够-通过新增磁盘-挂载原磁盘

    首先上一张图 -------1)首先fdisk 一块磁盘并格式化 mkfs.ext4 /dev/sda15 --------2)将此磁盘挂载在mnt目录下,并将磁盘容量不够的磁盘所有文件进行复制到mn ...

  4. SpringMVC+Mybatis初尝试

    一个月前简单学完了SpringMVC框架和Mybatis框架,一直没有使用过,今天主要用它做了个简单的学生管理系统,不过第一次用框架,实现的功能简单,比较low. 注:这里使用的数据库是SQLServ ...

  5. JS之预解释原理

    预解释的原理 预解释的不同机制 var的预解释机制 function 的预解释机制 预解释机制 面试题练习 预解释的的不同机制 预解释也叫预声明,是提前解释声明的意思:预解释是针对变量和函数来说的:但 ...

  6. 如何利用Excel设计一个唱票统计系统?

    具体操作如下: 首先需要一个如下的数据结构. 唱票数G列区域,不能手动输入候选人票数,这样很不方便,所以我们需要一个窗体控件,用点击鼠标的方法来实现唱票.在“开发工具-插入-数值调节钮”下图3处,然后 ...

  7. Spark GraphX企业运用

    ========== Spark GraphX 概述 ==========1.Spark GraphX是什么?  (1)Spark GraphX 是 Spark 的一个模块,主要用于进行以图为核心的计 ...

  8. List作为泛型参数实现可接收存储任意类型的List对象

    原文链接:https://blog.csdn.net/eeeeasy/article/details/80999650?utm_source=blogxgwz2 在项目中遇到一个问题,想要封装一个通用 ...

  9. TCP和UDP的Socket编程实验

    Linux Socket 函数库是从 Berkeley 大学开发的 BSD UNIX 系统中移植过来的.BSD Socket 接口是在众多 Unix 系统中被广泛支持的 TCP/IP 通信接口,Lin ...

  10. 一篇文章教会你使用Python定时抓取微博评论

    [Part1--理论篇] 试想一个问题,如果我们要抓取某个微博大V微博的评论数据,应该怎么实现呢?最简单的做法就是找到微博评论数据接口,然后通过改变参数来获取最新数据并保存.首先从微博api寻找抓取评 ...