tyvj 1198 矩阵连乘——区间dp
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的更多相关文章
- 区间dp复习 之 tyvj 1198 矩阵连乘
题目描述 一个\(n*m\)矩阵由\(n\)行\(m\)列共\(n*m\)个数排列而成.两个矩阵\(A\)和\(B\)可以相乘当且仅当\(A\)的列数等于\(B\)的行数.一个\(N*M\)的矩阵乘以 ...
- POJ 1651 Multiplication Puzzle(类似矩阵连乘 区间dp)
传送门:http://poj.org/problem?id=1651 Multiplication Puzzle Time Limit: 1000MS Memory Limit: 65536K T ...
- 蓝桥 ADV-232 算法提高 矩阵乘法 【区间DP】
算法提高 矩阵乘法 时间限制:3.0s 内存限制:256.0MB 问题描述 有n个矩阵,大小分别为a0*a1, a1*a2, a2*a3, ..., a[n-1]*a[n],现要 ...
- 蓝桥杯:矩阵乘法(区间DP)
http://lx.lanqiao.cn/problem.page?gpid=T417 题意:…… 思路:n=1000,一开始觉得区间DP会超时,后来想不到其他做法就这样做了,居然没超时. 状态转移: ...
- POJ1651 Multiplication Puzzle —— DP 最优矩阵链乘 区间DP
题目链接:https://vjudge.net/problem/POJ-1651 Multiplication Puzzle Time Limit: 1000MS Memory Limit: 65 ...
- 矩阵连乘 /// 区间DP oj1900
题目大意: 输入t :t为测试用例个数 接下来t个测试 每个测试用例 第一行输入n: n为矩阵个数 保证n个矩阵依序是可乘的 接下来n行 每行输入p,q:p为长度q为宽度 对给定的n个矩阵确定一个计算 ...
- TYVJ P1078 删数 Label:区间dp
描述 有N个不同的正整数数x1, x2, ... xN 排成一排,我们可以从左边或右边去掉连续的i个数(只能从两边删除数),1<=i<=n,剩下N-i个数,再把剩下的数按以上操作处理,直到 ...
- 算法提高 矩阵乘法 区间DP
这是神题,n <= 1000,如果是极限数据普通的n^3区间DP怎么可能过?可偏偏就过了. 刘汝佳大哥的训练指南上面说的存在nlgn的算法解决矩阵链乘问题,可是百度都找不到.... AC代码 # ...
- [jdoj1090]矩阵_区间dp
矩阵 jdoj-1910 题目大意:给你连续的n个矩阵的长和宽,保证每连续的两个相邻矩阵满足相乘的条件,不能改变题目中矩阵的位置,求将这些矩阵相乘为一个矩阵的最小乘法次数. 注释:1<=n< ...
随机推荐
- jetty 启动项目在pom.xml 的配置
<build> <finalName>${artifactId}</finalName> <resources> <resource> &l ...
- spring源码解读-ioc
本系列博客结合我的理解,对spring的ioc进行简单分析,欢迎大家批评指正. beanfactory 我们从beanfactory开始,beanfactory是最根部的容器,描述了整个ioc的一些规 ...
- 【MySQL】究竟什么是MVCC呢?
MVCC是什么呢? MVCC其实就是一个多版本并发控制,即多个不同版本的数据实现并发控制的技术,其基本思想是为每次事务生成一个新版本的数据, 在读数据时选择不同版本的数据即可以实现对事务结果的完整性读 ...
- c常用函数-strlen
strlen 返回字符串长度 Action() { char test[] = "yyyHHHJJJoo"; unsigned int a; a = strlen(test); l ...
- rust 生命周期2
之前定义的结构体,都是不含引用的. 如果想定义含引用的结构体,请定义生命周期注解 #[warn(unused_variables)] struct ImportantExcerpt<'a> ...
- 关于时间格式 GMT,UTC,CST,ISO
GMT: 格林尼治所在地的标准时间 UTC: 协调世界时,又称世界统一时间.世界标准时间.国际协调时间.由于英文(CUT)和法文(TUC)的缩写不同,作为妥协,简称UTC. 协调世界时是以原子时秒长为 ...
- cc23b_demo-函数对象c++ 调用操作符的重载与函数对象-//用模板定义一元谓词、代码示范
//用模板定义一元谓词. #include <iostream> #include <vector> #include <algorithm> using name ...
- Beta冲刺<3/10>
这个作业属于哪个课程 软件工程 (福州大学至诚学院 - 计算机工程系) 这个作业要求在哪里 Beta冲刺 这个作业的目标 Beta冲刺--第三天(05.21) 作业正文 如下 其他参考文献 ... B ...
- ASP.NET WebAPI框架解析第一篇
ASP.NET WebAPI有两种寄宿模式,一种是WebHost,一种是SelfHost,为什么可以有两种模式的原因在于WebAPI有一个相对独立的消息处理管道,只要给这个消息管道传递一个封装好的对象 ...
- Windows7/10实现ICMP(ping命令)
如果觉得本文如果帮到你或者你想转载都可以,只需要标注出处即可.谢谢 利用ICMP数据包.C语言实现Ping命令程序,能实现基本的Ping操作,发送ICMP回显请求报文,用于测试—个主机到只一个主机之间 ...