POJ 1651:Multiplication Puzzle(区间DP)
2024-09-01 01:27:38
http://poj.org/problem?id=1651
题意:给出n个数字,每取中间一个数,就会使得权值加上中间这个数和两边的乘积,求取剩两个数最少的权值是多少。
思路:区间dp。
一开始想了挺久还是写不出方程,做了点别的事回来再想就突然觉得很简单了。
一开始使得长度为1和2的区间dp[i][j]为0.
然后dp[i][j] = min(dp[i][k] + dp[k][j] + w[k] * w[i] * w[j])。
枚举的k为中间拿掉的数,然后和左右的区间和相加就是最后答案了。
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define N 105
typedef long long LL;
LL dp[N][N], w[N]; int main() {
int n;
while(~scanf("%d", &n)) {
memset(dp, 0x3f3f3f3f, sizeof(dp));
for(int i = ; i <= n; i++) scanf("%lld", &w[i]);
for(int i = ; i <= n; i++) dp[i][i] = dp[i][i+] = ;
//for(int i = 2; i < n; i++) dp[i][i] = w[i-1] * w[i] * w[i+1];
for(int len = ; len < n; len++) {
for(int i = ; i + len <= n; i++) {
int j = i + len;
for(int k = i + ; k < j; k++)
dp[i][j] = min(dp[i][j], dp[i][k] + dp[k][j] + w[i] * w[j] * w[k]);
}
}
printf("%lld\n", dp[][n]);
}
return ;
}
最新文章
- ArrayList和Vector以及synchronizedList
- NPOI 添加行
- IT行业工作6年回顾
- Swift-10--错误处理
- js对象2--工厂模式的由来--杂志
- ORACLE解锁record is locked by another user
- STM32之外部中断控制
- 引用头文件顺序问题 error C2039
- 【原】使用Json作为Python和C#混合编程时对象转换的中间文件
- html+css实现小米商城首页静态页面
- 如何获得ios7系统中的蓝色
- 2016-2017-2 20155339 实验二《Java面向对象程序设计》实验报告
- 学习笔记----float后不与前面元素同行解决办法。
- Vim技能修炼教程(15) - 时间和日期相关函数
- 《JAVA多线程编程核心技术》 笔记:第四章、Lock的使用
- Python 优雅的操作字典
- VHDL基础 学习笔记
- httpmodule VS2012 和 VS2013
- 配置Struts2后运行jsp出现404的解决方法
- String和八种基本数据类型互相转换