poj1651
2015-09-02 21:40
344 查看
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
View Code
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 7252 | Accepted: 4478 |
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 <cstdio> #include <iostream> #include <sstream> #include <cmath> #include <cstring> #include <cstdlib> #include <string> #include <vector> #include <map> #include <set> #include <queue> #include <stack> #include <algorithm> using namespace std; #define ll long long #define _cle(m, a) memset(m, a, sizeof(m)) #define repu(i, a, b) for(int i = a; i < b; i++) #define repd(i, a, b) for(int i = b; i >= a; i--) #define sfi(n) scanf("%d", &n) #define pfi(n) printf("%d\n", n) #define sfi2(n, m) scanf("%d%d", &n, &m) #define pfi2(n, m) printf("%d %d\n", n, m) #define pfi3(a, b, c) printf("%d %d %d\n", a, b, c) #define MAXN 105 const int INF = 0x3f3f3f3f; int a[MAXN]; int dp[MAXN][MAXN]; int main() { int n; while(~sfi(n)) { repu(i, 0, n) sfi(a[i]); _cle(dp, 0x3f); dp[0][0] = a[0]; a[n + 1] = 1; repu(i, 1, n + 1) dp[i][i] = a[i - 1] * a[i] * a[i + 1]; repu(i, 1, n) repu(j, 0, i) dp[i][j] = 0; for(int i = n - 1; i > 0; i--) repu(j, i + 1, n) repu(k, i, j + 1) dp[i][j] = min(dp[i][j], dp[i][k - 1] + a[k] * a[i - 1] * a[j + 1] + dp[k + 1][j]); pfi(dp[1][n - 2]); } return 0; }
View Code
相关文章推荐
- SharedPreference使用指导
- C++类构造函数初始化列表
- 【NOIP2014 Day2 T1】无线网络发射器选址
- JavaScript学习笔记4-闭包
- 主成分分析(多元分析方法之一)
- AlertDialog中EditText输入法调不出 edittext调用输入法等问题
- HDOJ 4468 Spy KMP
- 写给计算机的大学生
- 详解Android中AsyncTask的使用
- POJ 2362 Square
- HDU 5423 Rikka with Tree(简单DFS+枚举)
- PAT(B) 1005. 继续(3n+1)猜想
- 机器学习(五)—朴素贝叶斯
- 如果你的生活以金钱为中心
- JRE 和 JDK 的区别
- 把Edit with Sublime Text加入右键菜单
- linux命令之cut_v1
- uvalive6938
- Java并发编程(三) 并发类库中的常用类
- Redis使用总结之与Memcached异同