poj 1651 Multiplication Puzzle(区间dp 矩阵链乘法)
2015-06-17 10:14
274 查看
Language: Default Multiplication Puzzle
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 |
代价值为这个数与相邻两个数的乘积
这个题就是类似于矩阵乘法计算次数
#include <cstdio> #include <iostream> #include <cstring> #include <cmath> #include <algorithm> #include <string.h> #include <string> #include <vector> #include <queue> #define MEM(a,x) memset(a,x,sizeof a) #define eps 1e-8 #define MOD 10009 #define MAXN 10010 #define MAXM 100010 #define INF 99999999 #define ll __int64 #define bug cout<<"here"<<endl #define fread freopen("ceshi.txt","r",stdin) #define fwrite freopen("out.txt","w",stdout) using namespace std; int Read() { char c = getchar(); while (c < '0' || c > '9') c = getchar(); int x = 0; while (c >= '0' && c <= '9') { x = x * 10 + c - '0'; c = getchar(); } return x; } void Print(int a) { if(a>9) Print(a/10); putchar(a%10+'0'); } int dp[110][110],a[110]; int main() { //fread; int n; while(scanf("%d",&n)!=EOF) { for(int i=1;i<=n;i++) scanf("%d",&a[i]); MEM(dp,0); for(int i=n-2;i>=1;i--) { dp[i][i+2]=a[i]*a[i+1]*a[i+2]; for(int j=i+3;j<=n;j++) { dp[i][j]=a[i]*a[i+1]*a[j]+dp[i+1][j]; dp[i][j]=min(dp[i][j],a[i]*a[j-1]*a[j]+dp[i][j-1]); for(int k=i+2;k<j-1;k++) { dp[i][j]=min(dp[i][j],a[i]*a[k]*a[j]+dp[i][k]+dp[k][j]); } } } printf("%d\n",dp[1] ); } return 0; }
相关文章推荐
- WSAAccept()函数使用解析
- 字节对齐
- mtd驱动框架分析
- [安卓]手机管家(十一) 外拨电话 & 自定义toast
- Redis备份还原
- “东方之星”幸存者张辉说了一句话,残酷现实惊醒了很多人
- Lesson5 vSphere 5.0 存储
- Windows驱动学习笔记之二:VS2013集成IDE驱动调试
- MySQL性能优化的最佳20+条经验(1)
- tomcat在项目中的配置
- ASP.NET中的三种Timer(计时器)的区别和用法
- usb storage驱动分析
- vba编程不知道该使用什么对象属性方法实现操作的时候用宏录制来查阅代码
- quick中的静态布局和动态展示
- PayPal网站付款标准版(for PHP)
- 数据转换
- Android数据存储的五种方法汇总
- 译:编程面试的10大算法概念汇总
- Android横屏竖屏切换的问题
- MySQL性能测试工具之mysqlslap