POJ 1651 Multiplication Puzzle(区间DP)
2015-10-26 21:05
435 查看
http://poj.org/problem?id=1651。
头尾不动。通过从小到大枚举长度枚举区间,然后扩散到整个区间。
dp[i][j]表示从i开始到j的区间的分数最小值。
则长度显然从3开始。得到状态转移方程 dp[i][j] = min(dp[i][j], dp[i][k] + dp[k][j] + a[i] * a[k] * a[j])。
答案为dp[0][n-1]。
头尾不动。通过从小到大枚举长度枚举区间,然后扩散到整个区间。
dp[i][j]表示从i开始到j的区间的分数最小值。
则长度显然从3开始。得到状态转移方程 dp[i][j] = min(dp[i][j], dp[i][k] + dp[k][j] + a[i] * a[k] * a[j])。
答案为dp[0][n-1]。
#include <algorithm> #include <iostream> #include <sstream> #include <cstring> #include <cstdio> #include <vector> #include <string> #include <queue> #include <stack> #include <cmath> #include <set> #include <map> using namespace std; typedef long long LL; #define mem(a, n) memset(a, n, sizeof(a)) #define ALL(v) v.begin(), v.end() #define si(a) scanf("%d", &a) #define sii(a, b) scanf("%d%d", &a, &b) #define siii(a, b, c) scanf("%d%d%d", &a, &b, &c) #define pb push_back #define eps 1e-8 const int inf = 0x3f3f3f3f, N = 1e3 + 5, MOD = 1e9 + 7; int T, cas = 0; int n, m; int a , dp ; int main(){ #ifdef LOCAL freopen("/Users/apple/input.txt", "r", stdin); // freopen("/Users/apple/out.txt", "w", stdout); #endif while(si(n) != EOF) { for(int i = 0; i < n; i ++) si(a[i]); mem(dp, 0); for(int l = 3; l <= n; l ++) { for(int i = 0; i + l <= n; i ++) { int j = i + l - 1; dp[i][j] = inf; for(int k = i + 1; k < j; k ++) dp[i][j] = min(dp[i][j], dp[i][k] + dp[k][j] + a[i] * a[k] * a[j]); } } printf("%d\n", dp[0][n-1]); } return 0; }
相关文章推荐
- js图片懒加载资源引用
- 黑马程序员_毕向东_Java基础视频教程第02-03天_20151026(一)
- Log4Net在Windows服务中不能记录日志 z
- Linux新建用户
- leetcode:两个数的和||
- JavaScript之射击类小游戏的简单示例
- iOS 中UIButton的 settitle 和 titlelabel的使用误区
- SVG DEFS元素、SYMBOL元素和USE元素
- python 连接数据库-设置oracle ,mysql 中文字符问题
- 线性筛相关
- C#遍历时间范围内所有的时间
- linux概述
- Codeforces Round #324
- 内部类---匿名类
- 105 nginx nginx 配置
- iOS中的GCD总结
- mysql一些常用命令总结
- POJ-3164 Command Network (最小树形图)
- 智能电视遭重创 国产家电企业迎寒冬
- 求中位数。