POJ 1651 - Multiplication Puzzle(区间DP,矩阵链乘三种模版详解)

该博客介绍了如何解决POJ 1651问题,即在给定的数字序列中,以最小费用抽取中间数字。博主提供了三种解决方案:区间DP、矩阵链乘模版和记忆化搜索,并详细解释了状态转移方程和代码实现。三种方法均基于最优矩阵链乘的模版,实现了0ms的AC代码。
摘要由CSDN通过智能技术生成

【题意】题目链接http://poj.org/problem?id=1651 

给出n(<=100)个数字,每一个数字有一个权值Ai,求从中抽出除了第一个和最后一个以外的中间的数字的最小费用。抽取的顺序不同最后总的费用也不同,每次抽取第i个数字的费用为a[i-1]*a[i]*a[i+1];例如:有5个数字分别为10 1 50 20 5;

如果抽出的顺序为1->20->50的话总费用为

10*1*50 + 50*20*5 + 10*50*5 = 500+5000+2500 = 8000

如果抽出的顺序为50->20->1的话总费用为

1*50*20 + 1*20*5 + 10*1*5 = 1000+100+50 = 1150

【分析】有三种方法:

方法一:用dp[i][j]表示区间(数组下标)i~j之间所有数字全部抽出后的最小费用(最后留下i和j);k表示i~j之间最后一个抽出的数字。

则有状态转移方程:dp[i][j] = min{dp[i][j] , dp[i][k] + dp[k][j] + a[i]*a[k]*a[j]};就是找到区间i~j之间最后一个取出哪个数字费用最小。

其中区间i~k和区间k~j之间的最小费用都已经算出,所以直接加上最后一次取出k的费用a[i]*a[k]*a[j]就是当前的总费用。

细节请看代码注释。

 

方法二:把他看成白书上的最优矩阵链乘,用dp[i][j]表示区间(数组下标)i-

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值