poj1651(区间dp)
2015-09-03 12:43
405 查看
Multiplication Puzzle
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
Sample Output
Source
Northeastern Europe 2001, Far-Eastern Subregion
分析:区间从小到大,每次取出一个点,就相当于取某个已有区间的端点,起花费为该点和新区间的两端点的积,然后在遍历一次,找出该区间的最优解。
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 7255 | Accepted: 4481 |
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
Northeastern Europe 2001, Far-Eastern Subregion
分析:区间从小到大,每次取出一个点,就相当于取某个已有区间的端点,起花费为该点和新区间的两端点的积,然后在遍历一次,找出该区间的最优解。
#include <iostream> #include <cstdio> #include <cstring> #include <stack> #include <queue> #include <map> #include <set> #include <vector> #include <cmath> #include <algorithm> using namespace std; #define ll long long const double eps = 1e-6; const double pi = acos(-1.0); const int INF = 0x3f3f3f3f; const int MOD = 1000000007; int n,a[105],dp[105][105]; int main () { scanf ("%d",&n); for (int i=1; i<=n; i++) scanf ("%d",&a[i]); for (int i=n-2; i>0; i--) { dp[i][i+2] = a[i]*a[i+1]*a[i+2]; for (int j=i+3; j<=n; j++) { dp[i][j] = min(dp[i+1][j]+a[i]*a[i+1]*a[j], dp[i][j-1]+a[i]*a[j-1]*a[j]); for (int k=i+2; k<=j-2; k++) dp[i][j] = min(dp[i][j], dp[i][k]+dp[k][j]+a[i]*a[k]*a[j]); } } printf ("%d\n",dp[1] ); return 0; }
相关文章推荐
- 使用Storyboard拖线容易出错的地方
- 查找
- 自学QT之QApplication类和<qapplication.h>头文件
- AWS和OpenStack服务对照表,OpenStack服务英文单词的中文翻译
- EA使用教程的笔记
- Verilog仿真事件队列
- LTE学习:下行HARQ简介(由DCI格式控制)
- windows命令行由于输出信息太多看不了完整的信息怎么办
- 在Ubuntu 14.04 64bit下用Python搭建数据科学研究环境
- Android修改横屏的默认角度
- JS-案例-Select级联选择
- OC基础--Property
- Regionals 2014 >> Europe - Central >> 6934 - Good morning!
- 如何将IOS中Status Bar(状态栏)设置成黑底白字
- sharepoint 2013 如何调用自定义werbservice方法
- C++中构造函数和析构函数的调用顺序
- pycharm templates 设置
- 【HDU1281】【最大匹配】【取点枚举】
- Regionals 2014 >> Asia - Tehran >> 7017 - Working Hours【模拟】
- 基于apache实现tomcat集群的负载均衡