51 nod 石子归并 + v2 + v3(区间dp,区间dp+平行四边形优化,GarsiaWachs算法)
题意:就是求石子归并。
题解:当范围在100左右是可以之间简单的区间dp,如果范围在1000左右就要考虑用平行四边形优化。
就是多加一个p[i][j]表示在i到j内的取最优解的位置k,注意能使用平行四边形优化的条件:
1.证明w满足四边形不等式,这里w是m的附属量,形如m[i,j]=opt{m[i,k]+m[k,j]+w[i,j]},此时大多要先证明w满足条件才能进一步证明m满足条件
2.证明m满足四边形不等式
3.证明s[i,j-1]≤s[i,j]≤s[i+1,j]
。如果在10000左右时就要用GarsiaWachs算法
推荐一个博客http://www.cnblogs.com/jiu0821/p/4493497.html
有详细解释。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int inf = 0X3f3f3f3f;
long long dp[200][200] , a[200] , sum[200];
int main() {
int n;
scanf("%d" , &n);
for(int i = 1 ; i <= n ; i++) {
scanf("%lld" , &a[i]);
}
memset(dp , inf , sizeof(dp));
for(int i = 1 ; i <= n ; i++) {
dp[i][i] = 0;
}
sum[0] = 0;
for(int i = 1 ; i <= n ; i++) {
sum[i] = sum[i - 1] + a[i];
}
for(int l = 1 ; l < n ; l++) {
for(int i = 1 ; i <= n && i + l <= n ; i++) {
int j = l + i;
for(int k = i ; k < j ; k++) {
dp[i][j] = min(dp[i][k] + dp[k + 1][j] + sum[j] - sum[i - 1] , dp[i][j]);
}
}
}
printf("%lld\n" , dp[1][n]);
return 0;
}
////////////
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int inf = 0X3f3f3f3f;
long long dp[2010][2010] , a[2010] , sum[2010] ;
int p[2010][2010];
int main() {
int n;
scanf("%d" , &n);
for(int i = 1 ; i <= n ; i++) {
scanf("%lld" , &a[i]);
}
memset(dp , inf , sizeof(dp));
for(int i = 1 ; i <= 2 * n ; i++) {
dp[i][i] = 0;
p[i][i] = i;
}
sum[0] = 0;
for(int i = n + 1 ; i <= 2 * n ; i++) {
a[i] = a[i - n];
}
for(int i = 1 ; i <= 2 * n ; i++) {
sum[i] = sum[i - 1] + a[i];
}
for(int l = 1 ; l < n ; l++) {
for(int i = 1 ; i <= 2 * n && i + l <= 2 * n ; i++) {
int j = l + i;
for(int k = p[i][j - 1] ; k <= p[i + 1][j] ; k++) {
if(dp[i][j] > dp[i][k] + dp[k + 1][j] + sum[j] - sum[i - 1]) {
dp[i][j] = dp[i][k] + dp[k + 1][j] + sum[j] - sum[i - 1];
p[i][j] = k;
}
}
}
}
long long MIN = dp[1][n];
for(int i = 2 ; i <= n ; i++) {
MIN = min(MIN , dp[i][i + n - 1]);
}
printf("%lld\n" , MIN);
return 0;
}
////////////////
#include <iostream>
#include <cstring>
using namespace std;
#define LL long long
const int MAXN = 50005;
int n, num;
LL ans;
int dp[MAXN];
void combine(int now) {
int j;
int temp = dp[now - 1] + dp[now];
ans += (LL)temp;
for(int i = now; i < num - 1; i++) dp[i] = dp[i + 1];
num--;
for(j = now - 1; j > 0 && dp[j - 1] < temp; j--) dp[j] = dp[j - 1];
dp[j] = temp;
while(j >= 2 && dp[j - 2] <= dp[j]) {
int d = num - j;
combine(j - 1);
j = num - d;
}
}
int main()
{
scanf("%d", &n);
for(int i = 0; i < n; i++) scanf("%d", &dp[i]);
num = 1, ans = 0;
for(int i = 1; i < n; i++)
{
dp[num++] = dp[i];
while(num>=3 && dp[num-3]<=dp[num-1]) combine(num - 2);
}
while(num > 1) combine(num - 1);
printf("%lld\n", ans);
return 0;
}
51 nod 石子归并 + v2 + v3(区间dp,区间dp+平行四边形优化,GarsiaWachs算法)的更多相关文章
- 51nod 1022 石子归并 V2 —— DP四边形不等式优化
题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1022 1022 石子归并 V2 基准时间限制:1 秒 空间限 ...
- [51nod 1022] 石子归并v2 [dp+四边形不等式优化]
题面: 传送门 思路: 加强版的石子归并,现在朴素的区间dp无法解决问题了 首先我们破环成链,复制一条一样的链并粘贴到原来的链后面,变成一个2n长度的序列,在它上面dp,效率O(8n^3) 显然是过不 ...
- 51nod1022 石子归并 V2
证明w满足四边形不等式,这里w是m的附属量,形如m[i,j]=opt{m[i,k]+m[k,j]+w[i,j]},此时大多要先证明w满足条件才能进一步证明m满足条件证明m满足四边形不等式证明s[i,j ...
- 石子合并(直线版+环形版)&(朴素写法+四边形优化+GarsiaWachs算法)
石子合并-直线版 (点击此处查看题目) 朴素写法 最简单常见的写法就是通过枚举分割点,求出每个区间合并的最小花费,从而得到整个区间的最小花费,时间复杂度为O(n^3),核心代码如下: ; i < ...
- 51Nod 1022 石子归并 V2(区间DP+四边形优化)
题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1022 题目大意: N堆石子摆成一个环.现要将石子有次序地合并成 ...
- 51 Nod 1068 Bash游戏v3
1068 Bash游戏 V3 题目来源: Ural 1180 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题 收藏 关注 有一堆石子共有N个.A B两个人轮流 ...
- 51 Nod Bash 游戏v2
1067 Bash游戏 V2 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题 收藏 取消关注 有一堆石子共有N个.A B两个人轮流拿,A先拿.每次只能拿1,3 ...
- 51 Nod 1500 苹果曼和树(树形dp)
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1500 思路: 树形dp. 我们考虑当前结点 i ,对于结点 i ,它可以 ...
- 51 Nod 1006 最长公共子序列(LCS & DP)
原题链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1006 题目分析: 首先先知道LCS问题,这有两种: Long ...
随机推荐
- 语音控制单片机工作【百度语音识别,串口发送数据到单片机】【pyqt源码+软件】!!
前些天闲着没事,就做了个语音识别结合串口发送指令的软件,用的是pyqt写的,软件打开后对着笔记本的话筒说话, 他就能识别返回文字结果,然后匹配语音中的关键词,如果有关键词就发送关键词对应的命令,比如语 ...
- 【有容云干货-容器系列】Kubernetes调度核心解密:从Google Borg说起
在之前“容器生态圈脑图大放送”文章中我们根据容器生态圈脑图,从下至上从左至右,依次介绍了容器生态圈中8个组件,其中也提到Kubernetes ,是一个以 Google Borg 为原型的开源项目.可实 ...
- MyBatis 一级缓存、二级缓存全详解(一)
目录 MyBatis 一级缓存.二级缓存全详解(一) 什么是缓存 什么是MyBatis中的缓存 MyBatis 中的一级缓存 初探一级缓存 探究一级缓存是如何失效的 一级缓存原理探究 还有其他要补充的 ...
- 章节十五、7- 配置文件-Console Logging
一.创建xml文件 1.创建xml文件 在项目中我们需要专门建一个文件夹来放xml文件或者是其它文件. 2.然后对文件夹进行命名 3.选择new 其它 4.选择XML File 5.给xml文件命名 ...
- java集合类的相关转换
下面的的案例,基本上是以代码为主,文字的描述较少,后期有时间会继续添加. ArrayToList public void ArrayToList() { System.out.println(&quo ...
- Spring入门(八):自动装配的歧义性
1. 什么是自动装配的歧义性? 在Spring中,装配bean有以下3种方式: 自动装配 Java配置 xml配置 在这3种方式中,自动装配为我们带来了很大的便利,大大的降低了我们需要手动装配bean ...
- Django+Vue前后端分离项目的部署
部署静态文件: 静态文件有两种方式 1:通过django路由访问 2:通过nginx直接访问 方式1: 需要在根目录的URL文件中增加 url(r'^$', TemplateView.as_view( ...
- DRF (Django REST framework) 中的视图扩展类
2. 五个扩展类 1)ListModelMixin 列表视图扩展类,提供list(request, *args, **kwargs)方法快速实现列表视图,返回200状态码. 该Mixin的list方法 ...
- 解决Mac下VSCode打开zsh乱码
1.乱码问题 iTerm2终端使用Zsh,并且配置Zsh主题,该主题主题需要安装字体来支持箭头效果,在iTerm2中设置这个字体,但是VSCode里这个箭头还是显示乱码. iTerm2展示如下: VS ...
- 《白帽子讲web安全》——吴瀚清 阅读笔记
浏览器安全 同源策略:浏览器的同源策略限制了不同来源的“document”或脚本,对当前的“document”读取或设置某些属性.是浏览器安全的基础,即限制不同域的网址脚本交互 <scr ...