POJ 1651 Multiplication PuzzleDP方法:
2015-09-24 19:21
267 查看
有N张写有数字的卡片排成一行,按一定次序从中拿走N-2张(第1张和最后一张不能拿),每次只拿一张,取走一张卡片的同时,会得到一个分数,分值的计算方法是:要拿的卡片,和它左右两边的卡片,这三张卡片上数字的乘积。按不同的顺序取走N-2张卡片,得到的总分可能不相同,求出给定一组卡片按上述规则拿取的最小得分。
DP式子:
dp[L][R] = min(dp[L][R], dp[L][k]+dp[k][R] + a[L]*a[k]*a[R]);
两种方法:
================================================================================
记忆化搜索:
===================================================================================================
DP方法:
DP式子:
dp[L][R] = min(dp[L][R], dp[L][k]+dp[k][R] + a[L]*a[k]*a[R]);
两种方法:
================================================================================
记忆化搜索:
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<cmath> using namespace std; typedef long long LL; const LL INF = 0xfffffff; const LL maxn = 255; int dp[maxn][maxn], a[maxn]; int DFS(int L,int R) { if(dp[L][R]) return dp[L][R]; if(R-L <= 1) return 0; dp[L][R] = INF; for(int k=L+1; k < R; k++) dp[L][R] = min(dp[L][R], DFS(L,k)+DFS(k,R) + a[L]*a[k]*a[R]); return dp[L][R]; } int main() { int n; while(cin >> n) { memset(dp, 0, sizeof(dp)); for(int i=1; i<= n; i++) cin >> a[i]; printf("%d\n", DFS(1,n)); } return 0; } /* 6 10 1 50 50 20 5 **/
===================================================================================================
DP方法:
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<cmath> using namespace std; typedef long long LL; const LL INF = 0xfffffff; const LL maxn = 255; int dp[maxn][maxn], a[maxn]; int main() { int n; while(cin >> n) { memset(dp, 0, sizeof(dp)); for(int i=1; i<= n; i++) cin >> a[i]; for(int len=2; len <=n; len ++) { for(int i=1; i+len<=n; i++) { int j = i+len; for(int k=i+1; k<j; k++) { if(dp[i][j] == 0) dp[i][j] = dp[i][k] + dp[k][j] + a[i]*a[j]*a[k]; else dp[i][j] = min(dp[i][j],dp[i][k] + dp[k][j] + a[i]*a[j]*a[k]); } } } cout << dp[1] << endl; } return 0; } /* 6 10 1 50 50 20 5 **/
相关文章推荐
- Android 自定义View修炼-高仿猎豹清理大师自定义内存开口圆环比例进度View
- 对于项目编译时自动使用代码混淆的方法。
- 从浏览器地址栏里输入一个URL开始,到出现整个页面,网络上都发生了什么事?
- 常见的socket出错总结
- 字符串的匹配次数及匹配结束子串在主串中的位置
- 关于 LinkButton 放在 UpdataPanal 里面的一些问题
- 阶段总结3
- SQL扩展之T-SQL中的数据查询语言之统计计算
- 白话经典算法系列之六 快速排序 快速搞定
- 对代理的传值方式的深入理解以及使用
- nginx反向代理与负载均衡
- POJ 2955 Brackets (区间DP)
- 系统测试的方法和步骤初体验
- COM文件与EXE文件的区别与联系
- 恢复eclipse默认的背景色和字体等格式
- 笔试遇到的编程题
- 初在arm开发板测试经历
- Android利用Jsoup解析实现简单新闻客户端
- POJ 1062 昂贵的聘礼 (最短路应用 Dijkstra算法)
- c++primer 第三章习题(3)