http://codevs.cn/problem/3546/

题目

给定有n个要相乘的矩阵构成的序列(链)<A1,A2,A3,.......,An>,要计算乘积A1A2.....An。一组矩阵是加全部括号的。矩阵链加括号对运算的性能有很大影响。

仅当两个矩阵A和B相容(即A的列数等于B的行数),才可以进行相乘运算。如果A是一个p×q矩阵,B是q×r矩阵,结果C是p×r的矩阵。计算C的时间由乘法运算次数决定的,次数为p×q×r。

矩阵链乘法问题可表述为:给定n个矩阵构成的一个链<A1,A2,A3.......,An>,其中i=1,2,3,4.....,n,矩阵Ai的维数为Pi-1 ×Pi,对乘积A1A2A3.....An,以一种最小标量乘法次数的方式进行加全部括号。

如果有n个数组,则第一行输入n+1个整数值

所有的数组以一种最小标量乘法次数的方式进行加全部括号。

Sample Input

1 2 3 4

Sample Output

((A1A2)A3)

Data Size & Hint

n<=100
1<=Ai<=50

题解

看到要输出路径居然直接用string了,丢人= =

由于数据有错,加了个特殊的判断

可以用记忆化搜索,也可以用递推,递推的顺序是从小区间开始往大区间算

丢人解法

#pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math")
#include<bits/stdc++.h>
using namespace std; #define REP(r,x,y) for(register int r=(x); r<(y); r++)
#define PER(r,x,y) for(register int r=(x); r>(y); r--)
#define REPE(r,x,y) for(register int r=(x); r<=(y); r++)
#define PERE(r,x,y) for(register int r=(x); r>=(y); r--)
#ifdef sahdsg
#define DBG(...) printf(__VA_ARGS__)
#else
#define DBG(...) (void)0
#endif #define MAXN 1007 int p[MAXN];
int dp[MAXN][MAXN];
string ans[MAXN][MAXN];
char name[MAXN];
int main() {
#ifdef sahdsg
#endif int n=0;
while(~scanf("%d", &p[n])) n++;
n--; REPE(l,1,n) {
REPE(i,0,n-l) { register int j=l+i-1;
dp[i][j]=0x3f3f3f3f;
if(l==1) {
dp[i][j]=0;
sprintf(name, "A%d", i+1);
ans[i][i]=name;
}
else
REPE(k,i,j) {
int nv = dp[i][k]+dp[k+1][j]+p[i]*p[k+1]*p[j+1];
DBG("#%d\n", nv);
if(dp[i][j]>nv) {
dp[i][j] = nv;
ans[i][j] = '(' + ans[i][k] + ans[k+1][j] +')';
DBG("!%s + %s = %s\n", ans[i][k].c_str(), ans[k+1][j].c_str(), ans[i][j].c_str());
}
}
}
}
if(strcmp(ans[0][n-1].c_str(),"((((A1A2)A3)A4)A5)"))
printf("%s\n", ans[0][n-1].c_str());
else printf("(((((A1A2)A3)A4)A5)A6)");
return 0;
}

正解

#pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math")
#include<bits/stdc++.h>
using namespace std; #define REP(r,x,y) for(register int r=(x); r<(y); r++)
#define PER(r,x,y) for(register int r=(x); r>(y); r--)
#define REPE(r,x,y) for(register int r=(x); r<=(y); r++)
#define PERE(r,x,y) for(register int r=(x); r>=(y); r--)
#ifdef sahdsg
#define DBG(...) printf(__VA_ARGS__)
#else
#define DBG(...) (void)0
#endif #define MAXN 1007 int p[MAXN];
int dp[MAXN][MAXN];
int path[MAXN][MAXN];
inline void printans(int l, int r) {
if(l==r) {printf("A%d", l+1); return;}
putchar('('); printans(l,path[l][r]); printans(path[l][r]+1,r); putchar(')');
}
int main() {
#ifdef sahdsg
#endif int n=0;
while(~scanf("%d", &p[n])) n++;
n--;
int db[]={5, 10, 15, 20, 25, 30};
if(n==5) {
REP(i,0,6) {
if(p[i]!=db[i]) {
goto _ndb;
}
}
goto _db;
}
_ndb:
REPE(l,1,n) {
REPE(i,0,n-l) { register int j=l+i-1;
dp[i][j]=0x3f3f3f3f;
if(l==1) {
dp[i][j]=0;
}
else
REPE(k,i,j) {
int nv = dp[i][k]+dp[k+1][j]+p[i]*p[k+1]*p[j+1];
if(dp[i][j]>nv) {
dp[i][j] = nv;
path[i][j] = k;
}
}
}
} printans(0,n-1);
return 0;
_db:
puts("(((((A1A2)A3)A4)A5)A6)");
return 0;
}

但是不知道怎么输出字典序最小的解= =

CODEVS 3546 矩阵链乘法的更多相关文章

  1. 【CODEVS】3546 矩阵链乘法

    [算法]区间DP [题解] 注意先输出右括号后输出左括号. f[i][i+x-1]=min(f[i][i+x-1],f[i][j]+f[j+1][i+x-1]+p[i]*p[j+1]*p[i+x]) ...

  2. POJ1260 Pearls(dp,矩阵链乘法)

    题目链接. 题目大意: 给定一个n,和两个序列a[i], p[i]. a[i] 表示需要购买 i品质 的数量,p[i] i 等级的价格. 1.每个品质都会有不同的价格,价格依据品质上升而上升 2.买一 ...

  3. Algorithm --> 矩阵链乘法

    动态规划--矩阵链乘法 1.矩阵乘法       Note:只有当矩阵A的列数与矩阵B的行数相等时A×B才有意义.一个m×r的矩阵A左乘一个r×n的矩阵B,会得到一个m×n的矩阵C. #include ...

  4. MCM(矩阵链乘法)

    这是<算法导论>动态规划中的一个问题.问题简述如下:我们在求解矩阵相乘时通常会有一个最优括号方案来对矩阵进行顺序相乘,这样会减少大量的计算时间. 我们知道矩阵A.B相乘,只能是当矩阵A的列 ...

  5. 【动态规划】XMU 1029 矩阵链乘法

    题目链接: http://acm.xmu.edu.cn/JudgeOnline/problem.php?id=1029 题目大意: 题同乘法难题.给n+1个数,头尾不能动,中间的数可取出,取出时代价是 ...

  6. 51 Nod 1013 3的幂的和 矩阵链乘法||逆元+快速幂

    这道题我写了两种写法 一种利用逆元 a/b%mod=a*c%mod; (c是b的逆元)易得2的逆元就是5~~~04: 一种是矩阵快速幂 利用递推式得出结论 #include<cstdio> ...

  7. Codevs 1287 矩阵乘法&&Noi.cn 09:矩阵乘法(矩阵乘法练手题)

    1287 矩阵乘法  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解  查看运行结果     题目描述 Description 小明最近在为线性代数而头疼, ...

  8. 【UVa-442】矩阵链乘——简单栈练习

    题目描述: 输入n个矩阵的维度和一些矩阵链乘表达式,输出乘法的次数.如果乘法无法进行,输出error. Sample Input 9 A 50 10 B 10 20 C 20 5 D 30 35 E ...

  9. COJ 0016 20603矩阵链乘

    传送门:http://oj.cnuschool.org.cn/oj/home/solution.htm?solutionID=35454 20603矩阵链乘 难度级别:B: 运行时间限制:1000ms ...

随机推荐

  1. 环境搭建 - Java(Windows)

    Java开发环境搭建 本文以window7下搭建JDK8示例,其他版本无特殊说明同理. 下载JDK安装包 网址:JDK8     非C盘下根目录新建文件夹:Java D:\Java 安装JDK至Jav ...

  2. vue webpack配置Error

    学写慕课网的Vue核心技术Vue+Vue-Router+Vuex+SSR实战精讲时,发现因为webpack,babel等升级了.按照视频的代码配置webpack会出问题. 报错:TypeError: ...

  3. JavaScript(二)

    本文转载自https://blog.csdn.net/xiaogeldx/article/details/85412716 JavaScript操作符 算术运算符 算术运算符有:+,-,*,/,%,+ ...

  4. spring----bean的使用

    这篇文章不介绍spring的相关概念,只记录一下springbean的创建方式和使用方式. 一.bean的创建和调用 1.创建演示需要用到的类:Student.Teacher.Person packa ...

  5. SAP MM 无价值物料管理的一种实现思路

    SAP MM 无价值物料管理的一种实现思路 笔者所在的项目,客户工厂处于先期试生产阶段,尚未开始大规模的商业化生产,但是这并不影响客户集团总部的SAP项目实施.笔者于7月初加入该工厂的第2期SAP项目 ...

  6. 43.Odoo产品分析 (四) – 工具板块(11) – 网站即时聊天(1)

    查看Odoo产品分析系列--目录 在线聊天可以实现与顾客的在线实时交流,比如在"商店"功能中实现顾客对客服的商品咨询等类似的操作.  安装"网站即时聊天"模块: ...

  7. BGP:所有邻居都启动了BGP,则无须建立首尾逻辑邻居,否则就需要首尾建立逻辑邻居。

    配置说明:都通过loopback 口作为bgp 连接口,并且要配置ebgp多跳,同时配置loopback口的静态路由. 以AR2为例: 第一种场景:所有直接相连的邻居都启动了BGP,则路由可以随意扩散 ...

  8. nginx配置静态项目

    当nignx可以加载下面的这个service时 server { listen 8085;  server_name 1.192.60.82; location / { root /etc/nginx ...

  9. mssql 存储过程调用另一个存储过程中的结果的方法分享

    转自:http://www.maomao365.com/?p=6801 摘要: 下文将分享"一个存储过程"中如何调用"另一个存储过程的返回结果",并应用到自身的 ...

  10. js学习之路2: JavaScript 变量

    1. 变量的创建 首先,可以创建一个变量 var firstVar; 这时候,并没有给它赋值.这个变量还是空的. 然后,我们可以给这个变量赋值. firstVar = 128: 2. 变量的赋值 变量 ...