题意:就是求石子归并。

题解:当范围在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算法)的更多相关文章

  1. 51nod 1022 石子归并 V2 —— DP四边形不等式优化

    题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1022 1022 石子归并 V2  基准时间限制:1 秒 空间限 ...

  2. [51nod 1022] 石子归并v2 [dp+四边形不等式优化]

    题面: 传送门 思路: 加强版的石子归并,现在朴素的区间dp无法解决问题了 首先我们破环成链,复制一条一样的链并粘贴到原来的链后面,变成一个2n长度的序列,在它上面dp,效率O(8n^3) 显然是过不 ...

  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 ...

  4. 石子合并(直线版+环形版)&(朴素写法+四边形优化+GarsiaWachs算法)

    石子合并-直线版 (点击此处查看题目) 朴素写法 最简单常见的写法就是通过枚举分割点,求出每个区间合并的最小花费,从而得到整个区间的最小花费,时间复杂度为O(n^3),核心代码如下: ; i < ...

  5. 51Nod 1022 石子归并 V2(区间DP+四边形优化)

    题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1022 题目大意: N堆石子摆成一个环.现要将石子有次序地合并成 ...

  6. 51 Nod 1068 Bash游戏v3

    1068 Bash游戏 V3  题目来源: Ural 1180 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题  收藏  关注 有一堆石子共有N个.A B两个人轮流 ...

  7. 51 Nod Bash 游戏v2

    1067 Bash游戏 V2  基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题  收藏  取消关注 有一堆石子共有N个.A B两个人轮流拿,A先拿.每次只能拿1,3 ...

  8. 51 Nod 1500 苹果曼和树(树形dp)

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1500 思路: 树形dp. 我们考虑当前结点 i ,对于结点 i ,它可以 ...

  9. 51 Nod 1006 最长公共子序列(LCS & DP)

    原题链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1006 题目分析: 首先先知道LCS问题,这有两种: Long ...

随机推荐

  1. export,export default,module.exports,import,require之间的区别和关联

    module.exports Node 应用由模块组成,采用 CommonJS 模块规范.根据这个规范,每个文件就是一个模块,有自己的作用域.在这些文件里面定义的变量.函数.类,都是私有的,对外不可见 ...

  2. linux CPU100%异常排查

    1.top查找出占CPU比例最高的进程(5881): 2.查看该进程正在执行的线程: top -H -p  5881 3.将线程转换成16进制 printf ‘%x\n’ 5950 4.查看异常线程执 ...

  3. .xxx.sh脚本无法启动,原来都是特殊字符搞的鬼?

    今天遇到个趣的问题,linux上springboot启动,连接达梦数据库报错. 解决思路: 1)是不是数据库本身有问题,客户端登录没问题. 2)排查是不是war包问题,本地连接数据库,没问题. 3)是 ...

  4. Spark 系列(七)—— 基于 ZooKeeper 搭建 Spark 高可用集群

    一.集群规划 这里搭建一个 3 节点的 Spark 集群,其中三台主机上均部署 Worker 服务.同时为了保证高可用,除了在 hadoop001 上部署主 Master 服务外,还在 hadoop0 ...

  5. template.demo.js

    <!DOCTYPE html><html><head> <title>index</title> <meta charset=&quo ...

  6. Git简易使用教程

    1.Git 安装 2.设置git登录信息 3.git操作命令 4.提交代码的过程中几个命令的顺序 5.git 学习资料. 1.Git 安装 Git 下载地址:https://git-scm.com/d ...

  7. spark源码阅读---Utils.getCallSite

    1 作用 当该方法在spark内部代码中调用时,会返回当前调用spark代码的用户类的名称,以及其所调用的spark方法.所谓用户类,就是我们这些用户使用spark api的类. 2 内部实现 2.1 ...

  8. kvm 内部错误:无法找到适合 x86_64 的模拟器

    0x00 问题 安装完 KVM 之后,启动管理工具报错:内部错误:无法找到适合 x86_64 的模拟器 于是查看 libvirtd 服务状态,查看到以下内容: 6月 14 10:18:53 local ...

  9. C#_会员管理系统

    https://www.cnblogs.com/start-from-scratch/p/5420588.html

  10. Powered by .NET Core 进展0819:高速开车车况汇报

    继续以流水账的方式向大家汇报,自从上周六上午将 .net core 版博客站点从 windows 部署切换到 linux 上的 docker-compose 部署后,到目前一直在线. Linux 上没 ...