动态规划——Poj 1651 Multiplication Puzzle

【动态规划DP,二维动归】poj1651,Multiplication Puzzle http://poj.org/problem?id=1651 有N张写有数字的卡片排成一行,按一定次序从中拿走N-2张(第1张和最后一张不能拿),每次只拿一张,取走一张卡片的同时,会得到一个分数,分值的计算方法是:要拿的卡片,和它左右两边的卡片,这三张卡片上数字的乘积。按不同的顺序取走N-2张卡片,得到的总分可能不相同,求出给定一组卡片按上述规则拿取的最小得分。 思路,对于 阅读详情

1)   题目


Multiplication Puzzle

Time Limit: 1000MS

 

Memory Limit: 65536K

Total Submissions: 4948

 

Accepted: 2958

Description

The multiplication puzzle is played with arow of cards, each containing a single positive integer. During the move playertakes one card out of the row and scores the number of points equal to theproduct of the number on the card taken and the numbers on the cards on theleft and on the right of it. It is not allowed to take out the first and thelast 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 ofscored points. 

For example, if cards in the row contain numbers 10 1 50 20 5, player mighttake 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, thescore would be 

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

Input

The first line of the input contains thenumber of cards N (3 <= N <= 100). The secondline contains N integers in the range from 1 to 100, separated by spaces.

Output

Output must contain a single integer - theminimal score.

Sample Input

6

10 1 50 50 20 5

Sample Output

3650


2)    题意

有N张写有数字的卡片排成一行,按一定次序从中拿走N-2张(第1张和最后一张不能拿),每次只拿一张,取走一张卡片的同时,会得到一个分数,分值的计算方法是:要拿的卡片,和它左右两边的卡片,这三张卡片上数字的乘积。按不同的顺序取走N-2张卡片,得到的总分可能不相同,求出给定一组卡片按上述规则拿取的最小得分。


3)    数据范围

卡片的数量N(3<= N <= 100),卡片上的数字M(1<= M <= 100)。

给定的一组卡片,不同的拿取方法总共有(N-2)!种。枚举法不可行。

当N = 100,所有卡片上的数字都等于100时,得到的总分数T为:

T = (N-2) * (100 * 100 * 100) = 98000000

所以4字节整形即可存储。


4)    算法

这道题实质上就是矩阵连乘,所以可以使用动态规划法,或者备忘录法。

动态规划——矩阵连乘问题


5)    代码

#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

#define SIZE 105
#define INF 999999999

int cards[SIZE];
int d[SIZE][SIZE];

int MinScore(int n)
{
	memset(d, 0, sizeof(d));

	int len;
	for (len = 1; len < n; len++)
	{
		int i, j, k;
		for (i = 1, j = len+1; j < n; i++, j++)
		{
			int min = INF;
			for (k = i; k < j; k++)
			{
				int count = d[i][k] + d[k+1][j] + cards[i-1]*cards[k]*cards[j];
				if (count < min)
				{
					min = count;
				}
			}
			d[i][j] = min;
		}
	}
	return d[1][n-1];
}

int main(void)
{
	int ncards;
	while (scanf("%d", &ncards) != EOF)
	{
		int i;
		for (i = 0; i < ncards; i++)
		{
			scanf("%d", &cards[i]);
		}

		printf("%d\n", MinScore(ncards));
	}
	return 0;
}

6)    测试数据

 
6
10 1 50 50 20 5

7

30 35 15 5 10 20 25

3

1 2 3

100

100 100 100 100 100 100 100 100 100 100

100 100 100 100 100 100 100 100 100 100

100 100 100 100 100 100 100 100 100 100

100 100 100 100 100 100 100 100 100 100

100 100 100 100 100 100 100 100 100 100

100 100 100 100 100 100 100 100 100 100

100 100 100 100 100 100 100 100 100 100

100 100 100 100 100 100 100 100 100 100

100 100 100 100 100 100 100 100 100 100

100 100 100 100 100 100 100 100 100 100


7)    提交结果


【动态规划】区间DP - 最优矩阵链乘(另附POJ1651Multiplication Puzzle) 最优矩阵链乘(动态规划) 一个n∗mn*mn∗m的矩阵由 nnn 行 mmm 列共 n∗mn*mn∗m 排列而成。两个矩阵A和B可以相乘当且仅当A的列数等于B的行数。一个nm的矩阵乘mp的矩阵,运算量为nmp。 矩阵乘法不满足分配律,但满足结合律。因此A∗B∗CA*B*CA∗B∗C既可以按顺序 (A∗B)∗C(A*B)*C(A∗B)∗C 也可以按 A∗(B∗C)A*(B*C)A∗(B∗C) 来进行。假设A、B、CA、B、CA、B、C 分别是 2∗3、3∗4、4∗52*3、3*4、4*52∗3、3∗4、4∗5 阅读详情

相关推荐

简化神经元模型6 -- Hindmarsh-Rose Model

简化神经元模型 6 Hindmarsh-Rose Model

weixin_73557167的博客 1426

POJ-1651 Multiplication Puzzle 区间DP

题目链接:https://vjudge.net/problem/POJ-1651 题意: 题目的意思是给定一个数列,每次取出其中一个数字,价值增加这个数字与其左右两个数字的乘积,直到最后只剩两个数字,求价值的最小值。 分析: 首先这种一步步求最优解的问题,可以想到会不会是贪心问题?假设贪心可以解决,那么可以想到的策略就是每一步取使得增加价值最小的数字。但是事实是这种策略不是总正确...

weixin_30888707的博客 235

结构力学程序算法理论基础(一)————虚功原理

1.约束 定义约束:限制质点或者质点系运动的条件称为约束,表示这些限制条件的数学方程称为约束方程。 (1)几何约束 限制质点或者质点系在空间的几何位置的条件称为几何约束.如单摆,其中质点M可绕固定点O在平面Oxy内摆动,摆长为l.这时摆杆对质点的限制条件是:质点M必须在以点O为圆心,以l为半径的圆周上运动.其约束方程为: 又质点M在固定的曲面上运动,那么曲面方程就是质点M的约束方程,即 上...

l93919861的博客 4511

poj1651(矩阵连乘)

矩阵连乘算法:采用动态规划m[i][j]记录最优解值,s[i][j]记录最优解。 #include<iostream> #include<algorithm> #include<cstring> const int maxn=505; using namespace std; int s[maxn][maxn]; int m[maxn][maxn]; int a[maxn]; int p[maxn]; int N; struct node{ int x,y; }; vo

Keep_Trying_Go的博客 647

OTP语音芯片SOP8的前世今生_如九齐_硕呈_钰绅等以及国产方案KT148A

语音芯片ic的其中一个品类,就是SOP8封装的OTP语音芯片,非常的经典和常用。源头的供应商基本都是台系的原厂,比如:九齐、硕呈、佑华等等,其中佑华就算是鼻祖了,早期的4位机也是在语音市场得到了升华。 OTP(One Time Programmable)是单片机的一种存储器类型,意思是一次性可编程:程序烧入单片机后,将不可再次更改和清除。

qyvhome的博客 1873

信息学奥赛一本通高手训练1680:序列

题目 代码 #include<cstdio> #include<iostream> #include<cmath> #define LL long long using namespace std; const LL N = 1400000+7; const LL mod = 1e9+7; int n, t; LL pos[N], sum[N], ans[N]; struct node{ LL ll, rr; }a[N]; int main(){ p

qingfeixueyue的博客 468

(POJ - 1651)Multiplication Puzzle(区间DP)

题目链接:1651 -- Multiplication Puzzle 题意:给出一组N个数,每次从中抽出一个数(第一和最后一个不能抽),该次的得分即为抽出的数与相邻两个数的乘积。直到只剩下首尾两个数为止。问最小得分是多少? 分析:这道题显然是一道区间dp题,设dp[i][j]表示把从i到j的数全部抽光所能得到的最小得分 ,由区间dp的模板我们知道,现在已经遍历到了区间长度为j-i+1的地方了,所以区间长度小于j-i+1的都已经更新完成,我们就可以从i到j枚举最后一个抽的数来更新dp[i][j],也就是:

AC__dream的博客 388

MFC界面库BCGControlBar v32.0 - 对话框、仪表盘控件升级

亲爱的BCGSoft用户,我们非常高兴地宣布BCGControlBar Professional for MFC和BCGSuite for MFCv32.0正式发布!新版本支持Windows 11、增强功能区简化模式、改进控件外观等,以及其他新功能和改进。需要最新版的可以点击这里【BCG下载】 BCGControlBar Pro for MFC v32.0正式版下载 对话框和表单 1. 添加了一个新的全局标志globalData.m_bAutoPrepareComboListStyles:如果您希望.

需要界面开发、IDE工具研发中文教程资料的小伙伴,记得私信我~ 1145

Multiplication Puzzle POJ - 1651 (动态规划)

链接 分析:依次从左到右给你n个数字,每次取出一个数字(这个数字不能是最两边的数字), 这个数字和它左右两边的数字(一共三个数字)相乘,累加这个数。直到最后仅剩下两个数字。求最后累加的最小值。 对于整个牌的序列,最左端和最右端的牌是不能被取走的,除这两张以外的所有牌,必然有一张最后取走。取走这最后一张牌有一个仅与它本身以及最左端和最右端的牌的值有关的得分,这个分值与其他牌没有任何关系。当这张最后被取走的牌被定下来以后(假设位置为j), 最左端到j之间的所有牌被取走时所造成的得分必然只与这之间的牌有关从而与j

大聪明的博客 434

.ipynb文件深度解析:从JSON结构到Jupyter Notebook高效使用指南

在Python开发与数据处理领域,交互式编程正成为探索数据与验证思路的高效方式。Jupyter Notebook作为最流行的交互式环境之一,其默认文件格式.ipynb本质是一个基于JSON的文本文件,内部通过单元格组织代码、说明文字与运行结果。理解其JSON结构,不仅有助于掌握Notebook的存储原理,更能为文件损坏修复、版本控制与自动化转换提供基础。依托对单元格类型、魔法命令及输出可视化的熟练运用,数据分析和数据可视化流程可以变得更为流畅。同时,借助VS Code、nbconvert等工具,开发者能将.

weixin_28839629的博客 347

第8章-认知工程:构建Agent的认知飞轮与自进化《万物皆映射》

认知架构(Cognitive Architecture)是一个系统组织和运行其认知过程的整体设计。对人类而言,认知架构是大脑的结构和功能组织方式;对 AI Agent 而言,认知架构是它处理信息、做出决策、学习经验的系统设计。固定映射 vs 进化映射维度固定映射 Agent进化映射 Agent知识静态(训练时确定)动态(持续积累)策略固定(设计时确定)自适应(经验驱动)工具预定义自主发现/创建错误处理硬编码规则从错误中学习能力边界固定持续扩展在认知工程中,技能。

AI天才研究院 104

POJ - 1651 (区间DP)

题意:有一行n个数,需要从中取数,每次取数获得的权值为该数与左右相邻数的乘积,最左边和最右边的数不能被取到,求最小的权值之和。 分析:区间DP的典型题,可以用dp[i][j]表示第i个数和第j个数不取的时候,区间[i,j]的最小值 那么用k枚举所有的间断点表示上一个状态 dp[i][j]=min(dp[i][j],dp[i][k]+dp[k][j]+a[i]*a[k]...

weixin_30535167的博客 216

ARM功耗管理之功耗状态及功耗模式

思考:功耗状态?功耗模式?Core&Cluster&Device&SoC如何映射?

AI-安全-功耗 780

Multiplication Puzzle(POJ - 1651)(动态规划-区间dp)

Multiplication Puzzle(POJ - 1651)(动态规划-区间dp) judge:POJ 1651 Time Limit: 1000MS Memory Limit: 65536K source:Northeastern Europe 2001, Far-Eastern Subregion Description The multiplication puzzle is pl...

画船听雨眠 421

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

POJ 1651 Multiplication Puzzle 动态规划及搜索

这是一道比较简单的DP,通过分析可以设最后拿走的牌为i,则所求的最优解就是i左边和右边子列的最小连乘积再加上x[a]*x[i]*x[b],应为i将原来的序列划分为两个子列,这两个子列符合“最有子结构”和“重叠子问题”的dp特点,他们的最优解互相之间没有影响,只会影响全局问题的最优解,在POJ discuss中的解析比较经典,摘录如下,以后做题可以常常看看discuss,就当学习,但是还是要独立思考为主对于整个牌的序列,最左端和最右端的牌是不能被取走的,除这两张以外的所有牌 > ,必然有一张最后取走。取走这

Coding for Dreams 2556

WINCC7.3破解文件

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

动态规划 Multiplication Puzzle poj 1651

题目连接:http://poj.org/problem?id=1651 题目大意:给你一个数字序列abcde……,从中不断的取出数字,不能取头和尾的数据,每次取出一个数时,代价为这个数*它前面的那个数*它后面的那个数,然后次数不放回,知道剩下两个数为止,求最小代价。 代码:

凌风 1302

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

POJ1651Multiplication Puzzle题解动态规划DP

Multiplication PuzzleTime Limit: 1000MS Memory Limit: 65536KTotal Submissions: 3460 Accepted: 2034<br />DescriptionThe multiplication puzzle is played with a row of cards, each containing a single positive integer. During the move player takes one card out

魔神翼 2831

动态规划训练8 [E - Multiplication Puzzle POJ1651]

Multiplication Puzzle  POJ - 1651  题意: 在一个序列中,拿走一个数字,那么得分就是这个数字以及它相邻的两个数字,这三个数字的乘积。求最小得分。 这道题乍一看感觉是区间DP,但是需要逆向思考的技巧。 记dp[i][k]表示以i开头的,长度k的区间。 我们考虑一个区间的时候,记录区间的两个端点分别为l,r。 这个区间两侧的端点是不能

SUNSET 302

poj-1651-Multiplication Puzzle--区间DP

poj-1651-Multiplication Puzzle--区间DP Multiplication Puzzle Time Limit:1000MS Memory Limit:65536K Total Submissions:10734 Accepted:6704 Description The m...

weixin_30430169的博客 123

POJ 1651 Multiplication Puzzle【最优矩阵链乘,DP】

其实就是算法课上的例题,找到oj上的题提交测试一下。 POJ 1651 Multiplication Puzzle 题意可以转换为:给你n-1个矩阵(a0∗a1,a1∗a2,...,an−2∗an−1a_0*a_1, a_1*a_2 ,..., a_{n-2}*a_{n-1}a0​∗a1​,a1​∗a2​,...,an−2​∗an−1​),要将它们全部相乘,求一种加括号的乘法次序,使得矩阵的乘法次数之和最小,也就是动态规划中经典的最优矩阵链乘问题。 设dp[i][j]dp[i][j]dp[i][j]表示第i

nefu_ljw的博客 844

动态规划之划分动态规划:矩阵链乘 poj 1651 Multiplication Puzzle

题意:给你n个数,进行如下操作,问最小值              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+25

onthewaytotop的博客 247

POJ 1651 Multiplication Puzzle(区间dp)

题目链接: POJ 1651 Multiplication Puzzle 题意: 给出nn个数,每次可以选择从中取走一个数,取走的代价是它左右以及自身三个数的乘积,不允许取走首末两个数字,求将中间n−2n-2个数字都取走的最小代价和? 数据范围:n≤100,每个数字∈[1,100]n\leq 100,每个数字\in [1,100] 分析; 比较简单的区间dp. 用dp[i][j]dp[

ramay7 431
上一篇: 第3章 动态规划 矩阵连乘问题
下一篇: 贪心算法——NY 14 会场安排问题
庞老板
博客等级 码龄15年 127粉丝 66原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

庞老板

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值