【POJ 1651】【区间DP 矩阵链乘的变形】Multiplication Puzzle【一串数字,除了头尾不能动,每次取个数字,它与左右相邻数字的乘积为其价值,求价值和最小】
来源:互联网 发布:集装箱运输软件 编辑:程序博客网 时间:2024/06/06 02:50
传送门:POJ 1651
描述:
Multiplication Puzzle
Time Limit: 1000MS Memory Limit: 65536KTotal Submissions: 8754 Accepted: 5479
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.
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
If he would take the cards in the opposite order, i.e. 50, then 20, then 1, the score would be
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
610 1 50 50 20 5
Sample Output
3650
Source
Northeastern Europe 2001, Far-Eastern Subregion
题意:
一系列的数字,除了头尾不能动,每次取出一个数字,这个数字与左右相邻数字的乘积为其价值,最后将所有价值加起来,要求最小值
思路:
这些数字其实就是n-1个矩阵的行列的数展开的排列,按照矩阵链乘那样区间DP就好了
代码:
#include <iostream>#include <cstdio>#include <algorithm>#include <cstring>#include <queue>#include <vector>#include <map>#include <set>#include <stack>#include <sstream>#include <cmath>#include <cstdlib>#include<string>#include <ctime>#define mst(ss,b) memset(ss,b,sizeof(ss));using namespace std;const int inf=0x3f3f3f3f;const int N=105;int n,a[N],dp[N][N];int main(){ #ifndef ONLINE_JUDGE freopen("in.txt","r",stdin); #endif while(~scanf("%d",&n)){ for(int i=0; i<n; i++)scanf("%d",&a[i]); mst(dp, 0); for(int l=1; l<n; l++) for(int i=1,j=l+i; j<n; i++,j++){ int mn=inf; for(int k=i; k<j; k++) mn=min(mn, dp[i][k]+dp[k+1][j]+a[i-1]*a[k]*a[j]); dp[i][j]=mn; } printf("%d\n", dp[1][n-1]);//第一个矩阵到最后一个矩阵相乘 } return 0;}
0 0
- 【POJ 1651】【区间DP 矩阵链乘的变形】Multiplication Puzzle【一串数字,除了头尾不能动,每次取个数字,它与左右相邻数字的乘积为其价值,求价值和最小】
- POJ 1651 Multiplication Puzzle (区间dp 矩阵连乘)
- 机试-求一串数字中,最大与最小的数字的和
- POJ 1651 Multiplication Puzzle (区间DP/矩阵链乘优化)
- poj 1651 Multiplication Puzzle(区间dp 矩阵链乘法)
- POJ1651:Multiplication Puzzle(区间DP 最优矩阵链乘)
- poj1651-Multiplication Puzzle-区间dp/矩阵链乘
- POJ-1651 Multiplication Puzzle 矩阵连乘问题(区间dp)
- Multiplication Puzzle(区间DP:类似矩阵连乘问题的DP模板)
- 将[1,n^2]区间内n^2个数字分别填充到n*n的矩阵里,要求任意两个相邻的数字的和,它们的最大值最小是多少?
- poj 1651 Multiplication Puzzle(区间DP,直接用矩阵相乘的方式也对)
- POJ 1651 - Multiplication Puzzle(区间DP,矩阵链乘三种模版详解)
- 算出大于一串数字的最小值,要求此数值的相邻两位不能相同
- POJ 1651 Multiplication Puzzle (矩阵连乘)
- 最优矩阵链乘(动态规划dp)POJ 1651 Multiplication Puzzle
- poj 1651 Multiplication Puzzle 矩阵链乘问题
- 求最小的k个数字和求第k小的数字
- 论5数字的价值定位和推销策略
- SQL 之 事务
- Telnet Email篇
- Python爬虫入门二
- Unchecked Exception和Checked Exception的区别
- JAVA中的RMI
- 【POJ 1651】【区间DP 矩阵链乘的变形】Multiplication Puzzle【一串数字,除了头尾不能动,每次取个数字,它与左右相邻数字的乘积为其价值,求价值和最小】
- 深入理解Java的接口和抽象类
- 无缝轮播图
- C 进制转换程序
- Android自动测试:monkey使用
- Mr. Frog’s Problem(弱校联盟 十一专场)
- RS232电平与TTL电平转换
- 图的割点
- UVa 11624 - Fire!(BFS)