区间DP之矩阵连乘

给定不超过100个矩阵,目标是求它们相乘的最小计算次数。矩阵相乘次数由矩阵的行和列决定。通过动态规划方法,使用状态转移方程f[i][j]=min(f[i][k]+f[k+1][j]+a[i][k].x*a[i][k].y*a[k+1][j].y)求解,并更新矩阵的行和列信息。
摘要由CSDN通过智能技术生成

题目描述:

给定n个矩阵,求这n个矩阵相乘的最小计算次数

其中矩阵相乘的次数计算为:

A1*A2=A1的行*A1的列*A2的列(A1的列保证=A2的行)

输入格式:

第一行为矩阵个数n(n<=100),以后第二行至n+1行为第i个矩阵的行与列

输出格式:

输出最小相乘次数

想法:

设f[i][j]为第i个矩阵乘到第j个矩阵的最小相乘次数

那么我们可以很简单的得到:f[i][j]=min(f[i][k]+f[k+1][j])(k∈[i,j])

那要怎么得到每一个f[i][k]和f[k+1][j]的值呢

开始的时候我的想法是将f数组定义为结构体,f[i][j].x为第i个矩阵乘到第j个矩阵结果的行,f[i][j].y为结果的列,最后用f[i][j].ans储存答案。

一秒钟后我就发现了这个想法非常捞,不仅麻烦而且是错的,会影响DP过程中每一步的结果

所以我们在读入的时候采用a[i][i].x和a[i][i].y来储存第i个矩阵的行和列,状态转移方程就写为:

f[i][j]=min(f[i][k]+f[k+1][j]+a[i][k].x*a[i][k].y*a[k+1][j].y)

然后如果f[i][j]被更新了,就将a[i][j].x赋值为a[i][k].x,a[i][j].y赋值为a[k+1][j].y,这可以用一个简单的if语句做到

最后附上代码:

#include<bits/stdc+
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值