HDU 3506 Monkey Party(区间DP)题解
题意:有n个石堆排成环,每次能合并相邻的两堆石头变成新石堆,代价为新石堆石子数,问最少的总代价是多少
思路:先看没排成环之前怎么做:用dp[i][j]表示合并i到j所需的最小代价,那么dp[i][j]就是合并i~k、k+1~j的最小代价,即dp[i][j] = min(dp[i][j],dp[i][k] + dp[k + 1][j] + w[i][j]])。
for(int len = ; len <= n; len++){ //区间长度
for(int i = ; i + len - <= n; i++){ //起始位置
int j = i + len - ; //末尾位置
for(int k = i; k <= j; k++){
if(dp[i][j] > dp[i][k] + dp[k + ][j] + w[i][j]){
dp[i][j] = dp[i][k] + dp[k + ][j] + w[i][j]];
}
}
}
}
合并石堆环是,只要把n首尾相接扩展到2n,就可以了。
这个dp还可以用四边形不等式优化
代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
typedef long long ll;
using namespace std;
const int maxn = + ;
const int MOD = 1e9 + ;
const int INF = 0x3f3f3f3f;
int a[maxn], dp[maxn << ][maxn << ], sum[maxn];
int s[maxn << ][maxn << ]; //i到j的最佳分割点
int main(){
int n;
while(~scanf("%d", &n)){
sum[] = ;
memset(dp, INF, sizeof(dp));
for(int i = ; i <= n; i++){
scanf("%d", &a[i]);
a[i + n] = a[i];
}
for(int i = ; i <= * n; i++){
s[i][i] = i;
dp[i][i] = ;
sum[i] = sum[i - ] + a[i];
}
for(int len = ; len <= n; len++){ //长度
for(int i = ; i + len - <= * n; i++){ //起始位置
int j = i + len - ;
for(int k = s[i][j - ]; k <= s[i + ][j]; k++){
if(dp[i][j] > dp[i][k] + dp[k + ][j] + sum[j] - sum[i - ]){
dp[i][j] = dp[i][k] + dp[k + ][j] + sum[j] - sum[i - ];
s[i][j] = k;
}
}
}
}
int ans = INF;
for(int i = ; i <= n; i++){
ans = min(ans, dp[i][i + n - ]);
}
printf("%d\n", ans);
}
return ;
}
HDU 3506 Monkey Party(区间DP)题解的更多相关文章
- hdu 3506 Monkey Party 区间dp + 四边形不等式优化
http://acm.hdu.edu.cn/showproblem.php?pid=3506 四边行不等式:http://baike.baidu.com/link?url=lHOFq_58V-Qpz_ ...
- HDU 1069 Monkey and Banana dp 题解
HDU 1069 Monkey and Banana 纵有疾风起 题目大意 一堆科学家研究猩猩的智商,给他M种长方体,每种N个.然后,将一个香蕉挂在屋顶,让猩猩通过 叠长方体来够到香蕉. 现在给你M种 ...
- HDU 5115 Dire Wolf 区间dp
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5115 Dire Wolf Time Limit: 5000/5000 MS (Java/Others ...
- HDU 5693 D Game 区间dp
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5693 题解: 一种朴实的想法是枚举选择可以删除的两个或三个数(其他的大于三的数都能凑成2和3的和), ...
- hdu 4597 Play Game 区间dp
Play Game Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=459 ...
- hdu 5181 numbers——思路+区间DP
题目:http://acm.hdu.edu.cn/showproblem.php?pid=5181 题解:https://www.cnblogs.com/Miracevin/p/10960717.ht ...
- hdu 5693 && LightOj 1422 区间DP
hdu 5693 题目链接http://acm.hdu.edu.cn/showproblem.php?pid=5693 等差数列当划分细了后只用比较2个或者3个数就可以了,因为大于3的数都可以由2和3 ...
- hdu 4745 Two Rabbits 区间DP
http://acm.hdu.edu.cn/showproblem.php?pid=4745 题意: 有两只兔子Tom Jerry, 他们在一个用石头围城的环形的路上跳, Tom只能顺时针跳,Jerr ...
- HDU - 3506 Monkey Party
HDU - 3506 思路: 平行四边形不等式优化dp 这不就是石子归并(雾 代码: #pragma GCC optimize(2) #pragma GCC optimize(3) #pragma G ...
- E - Max Sum Plus Plus Plus HDU - 1244 (线性区间DP)
题目大意: 值得注意的一点是题目要求的是这些子段之间的最大整数和.注意和Max Sum Plus Plus这个题目的区别. 题解: 线性区间DP,对每一段考虑取或者不取.定义状态dp[i][j]指的 ...
随机推荐
- 十二 总结JS原型
基本概念: 对象:属性和方法的集合(变量和函数的封装). 构造器函数:用于创建对象的函数,通过new关键字生成对象.函数名一般首字母大写的. 原型对象:每个函数都有一个prototype属性,它是一个 ...
- Vue系列之 => 模拟购物车添加小球动画
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- HighCharts学习笔记(一)
HighChars基本概述 Highcharts是一个纯js写成的插件库,很好的外观表现可以满足任何图标需求. 开始使用chart之前进行配置 全局配置: Highcharts.setOptions( ...
- JavaScript-----截取字符串的常用方法
1.substring(start,stop) 用于提取字符串中介于两个指定下标之间的字符 start 必需,一个非负的整数,规定要提取的子串的第一个字符在 stringObject 中的位置 ...
- linux常用命令:touch 命令
linux的touch命令不常用,一般在使用make的时候可能会用到,用来修改文件时间戳,或者新建一个不存在的文件. 1.命令格式: touch [选项]... 文件... 2.命令参数: -a ...
- 转:[你必须知道的异步编程]C# 5.0 新特性——Async和Await使异步编程更简单
本专题概要: 引言 同步代码存在的问题 传统的异步编程改善程序的响应 C# 5.0 提供的async和await使异步编程更简单 async和await关键字剖析 小结 一.引言 在之前的C#基础知 ...
- multiple definition of qt_plugin_query_metadata
dustije 5 years ago I have a project with several plugins i want to compile into one library. I get ...
- hdu 1466 计算直线的交点数 递推
题目描述 平面上有n条直线,且无三线共点,问这些直线能有多少种不同交点数. 比如,如果n=2,则可能的交点数量为0(平行)或者1(不平行). 输入 输入数据包含多个测试实例,每个测试实例占一行,每行包 ...
- Porsche Piwis Tester 2 Online Coding Guide
Porsche Piwis online programming account service is piwis porsche subscription and piwis tester 2 on ...
- 关于数据库主从表、主键PRIMARY KEY 外键约束 FOREIGN KEY 约束----NOT NULL,DEFAULT,CHECK
如果由两个列共同组成主键,而且一个子表将主键作为可为空值的外键来继承,就可能得到错误的数据.可在一个外键列中插入有效的值,但在另一个外键列中插入空值.然后,可添加一个数据表检查约束,在可为空的外键中检 ...