【TYVJ P1014】乘法游戏
2015-08-14 09:48
253 查看
时间: 1000ms / 空间: 131072KiB / Java类名: Main
你的目标是使得分的和最小。
例如,如果数是10 1 50 20 5,依次拿1、20、50,总分是 10*1*50+50*20*5+10*50*5=8000
而拿50、20、1,总分是1*50*20+1*20*5+10*1*5=1150。
TYVJ的评测机不行了。搞得我得下测试数据。
这道题明显是一道动态规划题,而且是区间动规。那么怎么建立状态转移。
首先我们很容易想到,大区间都是由小区间推出来的,那么就会存在最优子结构。
然后,无论小区间怎么样都无法影响大区间的答案。那么状态转移方程就呼之欲出了。
设f[1][n - 2]是答案。
f[i][j] = min{f[i][k - 1] + f[k + 1][j] + a[i - 1] * a[k] * a[j + 1] | i < k < j}
但是呢,我们得先预处理出f[i][i]和f[i][i + 1]的答案并且把f[i][j] | j < i 的值设为0。
背景
太原成成中学第2次模拟赛 第四道描述
乘法游戏是在一行牌上进行的。每一张牌包括了一个正整数。在每一个移动中,玩家拿出一张牌,得分是用它的数字乘以它左边和右边的数,所以不允许拿第1张和最后1张牌。最后一次移动后,这里只剩下两张牌。你的目标是使得分的和最小。
例如,如果数是10 1 50 20 5,依次拿1、20、50,总分是 10*1*50+50*20*5+10*50*5=8000
而拿50、20、1,总分是1*50*20+1*20*5+10*1*5=1150。
输入格式
输入文件的第一行包括牌数(3<=n<=100),第二行包括N个1-100的整数,用空格分开。输出格式
输出文件只有一个数字:最小得分测试样例1
输入
6
10 1 50 50 20 5
10 1 50 50 20 5
输出
3650
TYVJ的评测机不行了。搞得我得下测试数据。
这道题明显是一道动态规划题,而且是区间动规。那么怎么建立状态转移。
首先我们很容易想到,大区间都是由小区间推出来的,那么就会存在最优子结构。
然后,无论小区间怎么样都无法影响大区间的答案。那么状态转移方程就呼之欲出了。
设f[1][n - 2]是答案。
f[i][j] = min{f[i][k - 1] + f[k + 1][j] + a[i - 1] * a[k] * a[j + 1] | i < k < j}
但是呢,我们得先预处理出f[i][i]和f[i][i + 1]的答案并且把f[i][j] | j < i 的值设为0。
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<cstdlib> using namespace std; long long f[105][105]; int a[105]; int n; int main() { scanf("%d", &n); for (int i = 0; i < n; ++i) scanf("%d", &a[i]); memset(f, 0x7f, sizeof(f)); f[0][0] = f[n - 1][n - 1] = 0; for (int i = 1; i < n - 1; ++i) f[i][i] = a[i - 1] * a[i] * a[i + 1]; for (int i = 1; i < n - 2; ++i) f[i][i + 1] = min(f[i][i] + f[i + 1][i + 1] / a[i] * a[i - 1], f[i + 1][i + 1] + f[i][i] / a[i + 1] * a[i + 2]); for (int i = 1; i < n; ++i) for (int j = 0; j < i; ++j) f[i][j] = 0; for (int i = n - 2; i > 0; --i) for (int j = i + 1; j < n - 1; ++j) for (int k = i; k <= j; ++k) f[i][j] = min(f[i][j], f[i][k - 1] + f[k + 1][j] + a[i - 1] * a[k] * a[j + 1]); cout << f[1][n - 2] << endl; //system("pause"); return 0; }
相关文章推荐
- hdu 4183 EK最大流算法
- noip1997 三角形 (搜索,枚举)
- winform listbox 新增、修改、移除、清空
- 五、设计模式——模板模式
- xcode快捷键使用
- Ehcache 整合Spring 使用页面、对象缓存
- 两数交换的几种办法
- popupwindow实现炫酷动画UI
- 优秀软件不是构建出来的,而是培育起来的
- SSIS 错误代码 DTS_E_CANNOTACQUIRECONNECTIONFROMCONNECTIONMANAGER(0xC0202009)
- 静态类成员
- PCB Layout初学者必会知识总结(转)
- 2016年Google面筋记录
- (大数据工程师学习路径)第三步 Git Community Book----中级技能(上)
- 构建您的第一个Grails 应用程序
- mybatis mapper.xml入参
- swift 字符串和字符相关
- jar 转换为dll外部链接库 C#调用
- coredump简介与coredump原因总结
- C++判断两个序列的包含关系: std::includes