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

【题意】题目链接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-

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值