DP:Multiplication Puzzle(POJ 1651)
题目大意:给你一排卡片,你可以从从中抽一些卡片(但是不能抽最左和最右的卡片),每张卡片上有一个数字,当你从中抽出一张卡片后,你将得卡片的数字和卡片左右两张卡片的数字的乘积的分数,问当剩下最左和最右两张卡片的时候,你可以得到的最小的分数?
这一题一看好像挺复杂的,但是如果我们换一个思维方式,这一题就会变得很熟悉
首先这一题是显而易见的DP(找最小值,不能取极限方式)
首先他要我们抽卡片是吧,一开始我们可能会想到先抽一张看看,然后在扫一遍其他卡片看能否抽,但是这样带来的直接后果就是,我们很难对先前我们抽过的卡片进行分数的储存,那么可以这么想,如果我们在抽卡片之前,把左i张右j张的卡片的抽取已经记下来了(相当于是抽空了),然后我们再把这张卡片和i-1和j+1的卡片的乘积+左i张和右j张卡片的分数加起来不就等于我们当前抽的卡片的分数了吗!那么最后我们就可以维护一个最小值区间,把区间不断扩大到n-2(除掉最左和最右两张),那得出的值即是最后的最小分数
而这个方法,正是矩阵乘法的顺序安排的思路,熟悉而亲切
#include <stdio.h>
#include <stdlib.h>
#include <string.h> static long long cards[];
static long long dp[][]; void Search(const int);
long long min(const long long, const long long); int main(void)
{
int N, i;
while (~scanf("%d", &N))
{
for (i = ; i < N; i++)
scanf("%d", &cards[i]);
//memset(dp, 0, sizeof(dp));
Search(N);
}
return ;
} long long min(const long long x, const long long y)
{
return x < y ? x : y;
} void Search(const int N)
{
int i, j, k, pos; for (i = ; i < N - ; i++)
dp[i][i] = cards[i - ] * cards[i] * cards[i + ];
for (k = ; k < N - ; k++)
{
for (i = ; i < N - - k; i++)
{
pos = i + k;
dp[i][pos] = cards[i] * cards[i - ] * cards[pos + ] + dp[i + ][pos];//注意cards的位置
for (j = i + ; j < pos; j++)
{
dp[i][pos] = min(dp[i][pos],
cards[j] * cards[i - ] * cards[pos + ] + dp[i][j - ] + dp[j + ][pos]);
}
dp[i][pos] = min(dp[i][pos], cards[i - ] * cards[pos] * cards[pos + ] + dp[i][pos - ]);
}
}
printf("%lld\n", dp[][N - ]);
}
DP:Multiplication Puzzle(POJ 1651)的更多相关文章
- 区间dp E - Multiplication Puzzle POJ - 1651
E - Multiplication Puzzle POJ - 1651 这个题目没有特别简单,但是也没有我想象之中的那么难,这个题目时区间dp,因为我们是要对区间进行考虑的. 但是呢,这个也和动态 ...
- Multiplication Puzzle POJ - 1651
解法 区间dp例题,长度从2开始到n结束起点从1到n,中间枚举的时候是看着左端点右端点与中点的乘积 代码 #include <iostream> #include <cstring& ...
- POJ 1651 区间DP Multiplication Puzzle
此题可以转化为最优矩阵链乘的形式,d(i, j)表示区间[i, j]所能得到的最小权值. 枚举最后一个拿走的数a[k],状态转移方程为d(i, j) = min{ d(i, k) + d(k, j) ...
- poj 1651 Multiplication Puzzle (区间dp)
题目链接:http://poj.org/problem?id=1651 Description The multiplication puzzle is played with a row of ca ...
- POJ 1651 Multiplication Puzzle(类似矩阵连乘 区间dp)
传送门:http://poj.org/problem?id=1651 Multiplication Puzzle Time Limit: 1000MS Memory Limit: 65536K T ...
- POJ 1651 Multiplication Puzzle (区间DP)
Description The multiplication puzzle is played with a row of cards, each containing a single positi ...
- Poj 1651 Multiplication Puzzle(区间dp)
Multiplication Puzzle Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 10010 Accepted: ...
- POJ 1651:Multiplication Puzzle 矩阵相乘式DP
Multiplication Puzzle Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7118 Accepted: ...
- POJ1651:Multiplication Puzzle(区间DP)
Description The multiplication puzzle is played with a row of cards, each containing a single positi ...
随机推荐
- Spring的拦截器
<filter> <filter-name>characterEncodingFilter</filter-name> <filter-class>or ...
- CodeMap
CodeMap 这是在博客园看到的一位朋友文章介绍的,很好用的插件,所有的方法,注释块在右边一目了然,找代码方便极了,还能设置代码段的高亮,给代码段设置标识
- POJ 2828 Buy Tickets
Description Railway tickets were difficult to buy around the Lunar New Year in China, so we must get ...
- HDU 1285 确定比赛名次
传送门 确定比赛名次 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total ...
- POJ1836Alignment(LCA)
Alignment Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 15135 Accepted: 4911 Descri ...
- MyEclipse2014中SVN的使用方法
MyEclipse中的SVN操作手册 1.导入项目 点击工具栏上的[File-Import],进入下图 (如果你的对话框中没有SVN这一条目,可能是因为你没有安装SVN插件,请安装完成后,在看这篇博客 ...
- 高德地图3D版的使用方法
坐标拾取器: http://lbs.amap.com/console/show/picker 其经纬度与LatLng()方法中的经纬度是对调的 SDK和实例下载: http://lbs.amap.co ...
- 初识A*算法
写这篇文章的初衷是应一个网友的要求,当然我也发现现在有关人工智能的中文站点实在太少,我在这里抛砖引玉,希望大家都来热心的参与. 还是说正题,我先拿A*算法开刀,是因为A*在游戏中有它很典型的用法,是人 ...
- Netbeans连接数据库
/* Netbeans连接数据库 NetBeans项目的“项目属性”中“库”一栏中.Tab页“编译和运行”中已经加上jdbc的驱动文件 */ Connection conn = null;//连接数据 ...
- POP3,全名为“Post Office Protocol - Version 3”,即“邮局协议版本3”
POP3 锁定 本词条由“科普中国”百科科学词条编写与应用工作项目 审核 . POP3,全名为“Post Office Protocol - Version 3”,即“邮局协议版本3”.是TCP/IP ...