POJ 1651 Multiplication Puzzle(区间dp)
来源:互联网 发布:cad怎么修改网络计划图 编辑:程序博客网 时间:2024/06/07 05:36
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
Source
题目大意:
给出n个数,除了第一个和第n个不能取出之外,你可以自由选择先后全部取出中间的n-1个数,但是每去一个数,需要a[i-1]*a[i]*a[i+1]的代价,如果旁边的数字已经被先取出,则再往旁边挪一位,求最少的代价。
解题思路:
设d[i][j]表示取出[i,j]之间的数需要的最少代价,则有
d[i][j]=min(d[i][k],d[k+1][j]+a[i]*a[k]*a[j] (k为最后一次取出的数)
#include<iostream>#include<cstring> using namespace std;#define INF 100000005int d[105][105],a[105];int main(){ int n; while(cin>>n) { for(int i=1;i<=n;i++) cin>>a[i]; memset(d,0,sizeof(d)); for(int len=2;len<n;len++) //区间(i,j)之间的长度 for(int i=2;i+len-1<=n;i++) { int j=i+len-1; d[i][j]=INF; //赋初值要足够大 for(int k=i;k<j;k++) //类似于矩阵链乘 k表示从(i,j)中最后抽取k d[i][j]=min(d[i][j],d[i][k]+d[k+1][j]+a[i-1]*a[k]*a[j]); } cout<<d[2][n]<<endl; } return 0;}
- POJ 1651 Multiplication Puzzle (区间DP)
- POJ 1651 Multiplication Puzzle(区间dp)
- poj 1651 Multiplication Puzzle (区间DP)
- POJ 1651 Multiplication Puzzle(区间DP)
- POJ 1651 Multiplication Puzzle(区间dp)
- POJ 1651 - Multiplication Puzzle(区间DP)
- POJ 1651 Multiplication Puzzle (区间DP)
- poj 1651 Multiplication Puzzle(区间DP)
- poj 1651 Multiplication Puzzle(区间DP)
- POJ 1651 Multiplication Puzzle(区间DP)
- POJ 1651 Multiplication Puzzle(区间DP)
- POJ 1651 Multiplication Puzzle(区间dp)
- POJ 1651 Multiplication Puzzle(区间DP)
- POJ 1651 Multiplication Puzzle(区间DP)
- POJ 1651 Multiplication Puzzle(区间DP)
- POJ 1651 Multiplication Puzzle(区间dp)
- POJ 1651:Multiplication Puzzle(区间DP)
- POJ 1651 Multiplication Puzzle(区间dp)
- java--第一篇
- C++上机实验三——每月有几天
- 杭电ACM 2602 Bone Collector背包
- 回忆录【三】
- Java解析txt文件
- POJ 1651 Multiplication Puzzle(区间dp)
- a标签获取value值
- 如何细粒度地控制你的MyBatis二级缓存(mybatis-enhanced-cache插件实现)
- CppPrimer笔记 Chapter12 动态内存
- 【算法】牛客网前端算法(20-30)
- 道听途说——JAVA文件中只能含有一个Public类
- 并发
- vs2013关闭安全函数检查
- C语言概述(1)