最优矩阵链乘——NBUT 1003

本文介绍了如何解决NBUT 1003问题,即矩阵链乘法的最优计算方式。通过确保子序列的最优乘法顺序,利用动态规划求解dp[i][j]表示的Ai到Aj的矩阵乘法最小次数。递推过程中,按照j-i递增的顺序进行,以保证长区间依赖短区间的正确性。给出了问题的关键思路和代码实现。
摘要由CSDN通过智能技术生成

题目链接:https://vjudge.net/problem/NBUT-1003

思路:也是和紫书上的一样,如果最后一次乘法是第k个,则从A1,A2,....Ak和Ak+1,Ak+2......An两个子序列都是最优乘法了,所以我们只需保证两个子结构最优,而子结构也是可以这样划分的,所以我们每次考虑的问题就是,把Ai,Ai+1...Aj乘起来的最少乘法次数,用dp[i][j]表示这个问题的值,有

                                                            dp[i][j]=min{dp[i][k]+dp[k+1][j]+pi-1*pk*pj}

关键是递推的次序要搞明白,当时就没做出来,还是参考大神的代码,按照j-i递增的方向递推,因为长区间的值依赖于短区间的值。具体实现还是需要斟酌一下的,代码如下:

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
typedef long long ll;

const int maxn=210;
const int INF=0x3f3f3f3f;
ll dp[maxn][maxn];
ll p[maxn];

/*
     递推方向如何写还是比较难想的,长区
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值