poj1651 区间dp入门

POJ 1651 - Multiplication Puzzle(区间DP,矩阵链乘三种模版详解) 【题意】题目链接http://poj.org/problem?id=1651 给出n(<=100)个数字,每一个数字有一个权值Ai,求从中抽出除了第一个和最后一个以外的中间的数字的最小费用。抽取的顺序不同最后总的费用也不同,每次抽取第i个数字的费用为a[i-1]*a[i]*a[i+1]; 阅读详情

Description
The multiplication puzzle is played with a row of cards, each containing a single positive integer. During the move player takes one card out of the row and scores the number of points equal to the product of the number on the card taken and the numbers on the cards on the left and on the right of it. It is not allowed to take out the first and the last card in the row. After the final move, only two cards are left in the row.

The goal is to take cards in such order as to minimize the total number of scored points.

For example, if cards in the row contain numbers 10 1 50 20 5, player might take a card with 1, then 20 and 50, scoring
10*1*50 + 50*20*5 + 10*50*5 = 500+5000+2500 = 8000

If he would take the cards in the opposite order, i.e. 50, then 20, then 1, the score would be
1*50*20 + 1*20*5 + 10*1*5 = 1000+100+50 = 1150.
Input
The first line of the input contains the number of cards N (3 <= N <= 100). The second line contains N integers in the range from 1 to 100, separated by spaces.
Output
Output must contain a single integer - the minimal score.
Sample Input
6
10 1 50 50 20 5
Sample Output
3650

这个题转移比较好转,就是普通的枚举区间就可以
难点在于如何删除
删除的时候找到一个点,那个对于两边来说这个点就是无法逾越的障碍
就可以用哪个这边的区间了
而对于这个点来说左右两边先拆了谁无所谓….
所以先拆左右后拆中间…

看似好像漏掉了一种情况那就是先拆中间的点
实际上并没有
因为在划分区间的时候就已经包含在内了…
比如中点枚举在c的时候,你想先拆c,后拆a到b和q到w。。。
那样不就和你左边的区间是a到c是一个道理了么….
就是这样…
并没有漏掉情况…
这个题做的很迷
没事的时候还需要多回忆

#include<iostream>
#include<cmath>
#include<memory.h>
#include<cstdio>
#include<algorithm>
using namespace std;
int n;
long long dp[101][101];
long long tu[101];
int inf=0x3f3f3f3f;
int main()
{
    while(cin>>n)
    {
        memset(dp,0,sizeof(dp));
        memset(tu,0,sizeof(tu));
        for(int a=1;a<=n;a++)cin>>tu[a];
        for(int a=1;a<=n;a++)
        {
            for(int b=1;b+a<=n-1;b++)
            {
                dp[b][b+a+1]=inf;
                for(int c=b+1;c<=b+a;c++)
                {
                    dp[b][b+a+1]=min(dp[b][b+a+1],dp[b][c]+dp[c][b+a+1]+tu[b]*tu[c]*tu[b+a+1]);
                }
            }
        }
        cout<<dp[1][n]<<endl;
    }
    return 0;
}
POJ1651 题目:http://poj.org/problem?id=1651 是n个数相乘,每次从中抽取一个数出来与相邻两个数相乘,直到抽到只剩两个数字,第一个数和最后一个数不能抽。 遇到这题又犯迷糊了,知道应该用DP做,就是不知道怎么方程,和矩阵链相似又不相似,后面又看了一下矩阵链,才发现其实题目原型就是一个矩阵链。序列就是相当于N个矩阵相乘,求乘法次数最少,直接按算法导论上写就行了。 AC代码: 阅读详情

相关推荐

别再死记硬背了!用MaxDEA软件实操SBM、DDF、NDDF模型,手把手教你测算绿色全要素生产率

本文深度解析如何使用MaxDEA软件实操SBM、DDF、NDDF模型,手把手教你测算绿色全要素生产率(GTFP)。通过详细的模型选择对比、数据准备策略和MaxDEA操作流程,帮助研究者科学构建指标体系并准确解读结果,提升环境管理研究的实证分析能力。

weixin_28731231的博客 314

poj 1651 区间dp+矩阵连乘DP

http://poj.org/problem?id=1651 Description The multiplication puzzle is played with a row of cards, each containing a single positive integer. During the move player takes one card out of the ro

ACM,再见! 909

ADRV9009的学习历程(一)

** AD9361的同胞ADRV9009 ** 终于记录一下了 距离第一次想写博客记录自己学习的点点滴滴,大概已经过去有一年有余。一直都是停留在心有余而力不足的境界。 基本每次做项目遇到问题都会来优快云寻求帮助,这里虽离庙堂较远,但高手云集。每每读来,思绪万千,次次膜拜。 趁这次又学习了一样新物件,就记录一下,望大神看见能赐教一下。 ADRV9009 最近有项目要用到ADRV9009这个芯片。就来学习一下。做过AD9361的都知道,ADI官方会给出这个芯片的参考手册、数据手册和驱动程序。当然我只是见过AD

weixin_42868560的博客 1万+

poj1651(区间dp)

链接:点击打开链接 题意:给出N个数,每次从中抽出一个数(第一和最后一个不能抽),每次的得分为抽出的数与相邻两个数的乘积,直到只剩下首尾两个数为止,问最小得分是多少 代码: #include #include #include #include #include using namespace std; const int INF=0x3f3f3f3f; int a[

stay_accept的专栏 931

海康视觉平台VisionMaster实战入门:从通讯配置到工具应用

本文为海康VisionMaster视觉平台实战入门指南,详细介绍了从软件安装准备、与PLC等外部设备的通讯配置,到匹配定位、测量、畸变矫正等核心工具的应用方法。通过实战案例拆解,帮助工程师快速掌握如何搭建完整的机器视觉检测与引导定位系统,实现工业自动化项目落地。

weixin_29224309的博客 1016

数学建模美赛O奖论文研读启示录——从模仿开始

数学建模美赛O奖论文哪些地方比较出彩?我们可以从中学到什么东西?可以从哪些地方进行模仿?我总结了一些O奖论文里我认为比较好的地方,跟大家一起学习交流!

小宇的修炼之路 5429

poj1651解题报告

题目大意:给出一组N个数,每次从中抽出一个数(第一和最后一个不能抽),该次的得分即为抽出的数与相邻两个数的乘积。直到只剩下首尾两个数为止。问最小得分是多少? 解题思路:用dp,转化为矩阵链乘问题,但要注意最后一前一尾两个数不能算进去,所以处理起来还是好一定的差别!!! #include #include #include #include using namespace std; c

h123120的专栏 807

工业视觉降本300%实战:C# + 开源YOLO如何干掉Halcon/VisionPro?

在当前制造业普遍追求“降本增效”的大背景下,工业视觉检测系统作为产线的眼睛,其成本问题日益突出。通过该方案,我们成功帮助一家电子厂将单条产线的视觉检测成本从15万降低至不足5千(主要为工控机硬件成本),降本幅度超过95%,且系统稳定性经受住了6个月连续生产的考验。:C#负责“工程化”和“业务逻辑”,YOLO负责“智能算法”,二者结合,完美覆盖了工业视觉从算法到落地的全链路。的组合,构建一套高性能、低成本、易维护的工业视觉解决方案,并彻底替代昂贵的付费库。” 这是一个典型的误区。工业相机/USB相机。

2601_94871597的博客 430

POJ 2955 Brackets 区间DP 入门

dp[i][j]代表i->j区间内最多的合法括号数 if(s[i]=='('&&s[j]==')'||s[i]=='['&&s[j]==']') dp[i][j]=dp[i+1][j-1]+2; dp[i][j]=max{dp[i][k]+dp[k+1][j]}; 注意要对于区间的最值合并 ac代码: #inclu...

weixin_30535167的博客 120

英飞凌TC3xx之一起认识GTM(八)如何使用DTM实现死区时间配置

本文简要介绍英飞凌TC3xx系列芯片的DTM模块结构,以及有哪些相关寄存器可用于实现相关配置。

无所适从的我的博客 4650

WOFOST作物模型(3):敏感性分析

使用TAGP(Total Above Ground Production),地上总产量TSUM1,temperature sum from emergence to anthesis,萌发至开花所需温度TSUM2,temperature sum from anthesis to maturity,开花至成熟所需温度SPAN,life span of leaves growing at 35 Celsius,生长温度为35度时的叶龄。

所有专家都曾始于新手 1146

poj2955(区间dp基础)

#include #include #include using namespace std; char s[150]; int f[150][150]; //f[i][j]表示s[i]到s[j]区间匹配的最多括号数 int main() { while(scanf("%s",s)) { if(s[0]=='e') break; int len=st

zizahn的博客 410

RAG测评实战代码

本文主要介绍了RAG测评实战代码,希望对使用RAG的同学们有所帮助。 文章目录 1. 前言 2. 实战代码 2.1 实战代码一 2.2 实战代码二

herosunly的博客 1万+

区间DP入门-poj 1651

区间DP ,顾名思义,就是在区间上的DP,这种dp,常常是针对一些 序列长度比较小,并且操作都是有一定的次序,往往是对其中的一段进行操作,并且可以通过分治的思想,将大的一段,由小的一段结合起来的题目。如果碰到这样的题目,我们可以首先考虑区间dppoj 1651 题目大意是:给你一个序列 ,你要在其中选择n-2个数,每个数取出来的时候,结果 要加上 它乘以它左边的再乘以它右边的,也就是 a[i]

beckyUp的博客 393

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

区间DP入门笔记(4)乘法拼图 POJ-1651

2.引入dp[ i ][ j ]二维数组来表示 i 到 j 的矩阵乘法的最大次数。(此处需要注意的是dp数组储存的是乘法值,相当一个矩阵,而此矩阵的长和宽分别是a[ i-1] a[ j ])DP状态转移方程:dp[i][j] = min(dp[i][j], dp[i][k] + dp[k + 1][j] + a[i - 1] * a[k] * a[j]);3:用for循环带入状态转移方程(此处需要注意的是n个数只能组成n-1个矩阵,因此上限是n-1)1.我们用从0~n-1的方式给数组a[ i ]赋值。..

m0_62102955的博客 340

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

区间DP入门-POJ1651

借鉴了其他博客的思路整理了一下代码#include&lt;stdio.h&gt;#include&lt;iostream&gt;#include&lt;algorithm&gt;#include&lt;string.h&gt;using namespace std;#define INF 9999999int dp[105][105];int num[105];int main(){    int...

Zenith_Habitant的博客 243

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

[POJ-1651]Multiplication Puzzle [区间DP 入门]

The multiplication puzzle is played with a row of cards, each containing a single positive integer. During the move player takes one card out of the row and scores the number of points equal to the pr...

lzs_lazy 214

区间dp入门(POJ 1651 Multiplication Puzzle)

是n个数相乘,每次从中抽取一个数出来与相邻两个数相乘,直到抽到只剩两个数字,第一个数和最后一个数不能抽。 求最小值 //想法还是区间dp的模式 #include &lt;cstdio&gt; #include &lt;iostream&gt; #include &lt;cstring&gt; using namespace std; int main() { int i,j,k,l...

lanshan1111的博客 205

poj1651/zoj1602 Multiplication Puzzle(区间dp入门)

题目 给你一个序列a[],两端的数不能进行操作 剩下的可以被选中, 每次选中会导致这个数和它左右两个数相乘成为一个新的数, cost+=新的数 然后问怎么选能使这个序列最后只剩下两个端点的时候cost最小, 输出这个cost 思路来源 https://www.cnblogs.com/hoodlum1980/archive/2012/06/07/2540150.html 题解 这...

小衣同学的博客 256

区间dp入门[POJ2955][HDU2476][POJ3186][POJ1651][HDU4632][HDU4283][HDU4570][POJ3280]

[POJ2955][HDU2476][POJ3186][POJ1651][HDU4632][HDU4283][HDU4570][POJ3280]区间dp问题,通常给出一个序列,用dp[ i ][ j ] 表示序列为ai,a(i + 1)...aj时的答案,而较长的序列的答案由较短的序列的答案递推得到,让人想到矩阵连乘顺序问题。 所以解题的时候会用到3个循环: 第一层枚举序列长度 jj;第二层枚举序列开头的位置 i ;第三层枚举序列 [i, i + jj ] 中间点 k,其中第三层有时是不需要的.

cookiesMonster 452

poj-1651 Multiplication Puzzle(区间dp入门)

Multiplication Puzzle Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9957 Accepted: 6152Description The multiplication puzzle is played with a row of cards, each containing a si

菜鸟的进阶之路 374

POJ 1651 Multiplication Puzzle(区间dp入门)

The goal is to take cards in such order as to minimize the total number of scored points.For example, if cards in the row contain numbers 10 1 50 20 5, player might take a card with 1, then 20 and 50,...

running_acmer的博客 172

区间dp入门——总结+习题+解析

前天学长拉了个区间dp的专题,花了两个做,今天就来做个总结吧!!! 区间dp其实就是一种建立在线性结构上的对区间的动态规划,dp本来就是很奇妙的东西,也没有什么套路,就是一种思考的数学思维方式,只有做足够多的题并且想的足够多才可能在比赛中做出来。 区间dp,顾名思义,在区间上dp,大多数题目的状态都是由区间(类似于dp[l][r]这种形式)构成的,就是我们可以把大区间转化成小区间来处理,然后对...

mumei的博客 1万+

poj1651 区间dp

poj1651 区间dp 题目链接:http://poj.org/problem?id=1651 题的大意是:给出一组N个数,每次从中抽出一个数(第一和最后一个不能抽),该次的得分即为抽出的数与相邻两个数的乘积。直到只剩下首尾两个数为止。问最小得分是多少? dp[i][j] : 以i和j作为左右端点取数后的最小代价(最后只剩i和j) 转移方程: dp[i][j]=min(dp[i][j],dp[i...

wangkr ‘s blog 218

动态规划入门(九) 区间DP

顾名思义,区间dp就是在区间上进行动态规划,求解一段区间上的最优解;该问题的求解思路主要是通过合并小区间的最优解进而得出整个大区间上最优解的dp算法。

这里是阿安的博客 6万+

poj1651 Multiplication Puzzle(简单区间dp)

题目链接:http://poj.org/problem?id=1651 题意:一系列的数字,除了头尾不能动,每次取出一个数字,这个数字与左右相邻数字的乘积为其价值, 最后将所有价值加起来,要求最小值。 这题容易会想到贪心就是先把最大的数先取出这样就能满足剩下的总价值尽可能的小,如果出现多个一样 的数时优先取走价值小的,但是如果有出现多个价值一样的话就不好处理了。 于是可以考虑一...

awow80285的博客 138
上一篇: HDU5902
下一篇: poj3122 二分
NineFailure
博客等级 码龄11年 22粉丝 317原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值