有很多种算法:

1,任意两堆可以合并:贪心+单调队列。

2,相邻两堆可合并:区间DP    (O(n^3)) )。

3,相邻,四边形不等式优化DP (O(n^2) )。

4,相邻,GarsiaWachs算法    (O(nlgn))。

这里实现了第2,3种解法:(个人的区间DP习惯从后面向前面扫)

看起来第四种还是比较重要的,有空再搞。

2:暴力DP

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<iostream> using namespace std;
const int inf=;
int a[],dp[][],sum[];
int main()
{
int n,i,j,k;
scanf("%d",&n);
for(i=;i<=n;i++) scanf("%d",&a[i]);
for(i=;i<=n;i++) sum[i]=sum[i-]+a[i];
for(i=;i<=n;i++)
for(j=;j<=n;j++) dp[i][j]=inf;
for(i=;i<=n;i++) dp[i][i]=; for(i=n-;i>=;i--)
for(j=i+;j<=n;j++)
for(k=i;k<=j;k++)
dp[i][j]=min(dp[i][k]+dp[k+][j]+sum[j]-sum[i-],dp[i][j]);
printf("%d\n",dp[][n]);
return ;
}

3:优化DP

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<iostream>
#define LL long long
using namespace std;
LL min(LL a,LL b){
if(a<b) return a;return b;
}
const LL inf=;
LL a[],dp[][],sum[];
LL s[][],ans=inf;
int main()
{
LL n,i,j,k;
scanf("%lld",&n);
for(i=;i<=n;i++) {
scanf("%lld",&a[i]);
a[i+n]=a[i];
}
for(i=;i<=*n;i++) sum[i]=sum[i-]+a[i];
for(i=;i<=*n;i++)
for(j=;j<=*n;j++)
dp[i][j]=(i==j?:inf); for(i=*n-;i>=;i--)
for(j=i+;j<=*n;j++){
LL L=s[i][j-]?s[i][j-]:i;
LL R=s[i+][j]?s[i+][j]:n+n;
for(k=L;k<=R;k++){
LL tmp=dp[i][k]+dp[k+][j]+sum[j]-sum[i-];
if(dp[i][j]>tmp){
dp[i][j]=tmp;
s[i][j]=k;
}
}
}
for(i=;i<=n;i++)
ans=min(ans,dp[i][i+n-]);
printf("%lld\n",ans);
return ;
}

【整理】石子合并问题(四边形不等式DP优化)的更多相关文章

  1. 区间DP石子合并问题 & 四边形不等式优化

    入门区间DP,第一个问题就是线性的规模小的石子合并问题 dp数组的含义是第i堆到第j堆进行合并的最优值 就是说dp[i][j]可以由dp[i][k]和dp[k+1][j]转移过来 状态转移方程 dp[ ...

  2. 石子合并(四边形不等式优化dp) POJ1160

    该来的总是要来的———————— 经典问题,石子合并. 对于 f[i][j]= min{f[i][k]+f[k+1][j]+w[i][j]} From 黑书 凸四边形不等式:w[a][c]+w[b][ ...

  3. [HDU3516] Tree Construction [四边形不等式dp]

    题面: 传送门 思路: 这道题有个结论: 把两棵树$\left[i,k\right]$以及$\left[k+1,j\right]$连接起来的最小花费是$x\left[k+1\right]-x\left ...

  4. [HDU3480] Division [四边形不等式dp]

    题面: 传送门 思路: 因为集合可以无序选择,所以我们先把输入数据排个序 然后发先可以动归一波 设$dp\left[i\right]\left[j\right]$表示前j个数中分了i个集合,$w\le ...

  5. [POJ1160] Post Office [四边形不等式dp]

    题面: 传送门 思路: dp方程实际上很好想 设$dp\left[i\right]\left[j\right]$表示前$j$个镇子设立$i$个邮局的最小花费 然后状态转移: $dp\left[i\ri ...

  6. 记忆的轮廓 期望 四边形不等式dp|题解

    记忆的轮廓 题目描述 通往贤者之塔的路上,有许多的危机.我们可以把这个地形看做是一颗树,根节点编号为1,目标节点编号为n,其中1-n的简单路径上,编号依次递增,在[1,n]中,一共有n个节点.我们把编 ...

  7. 51Nod 1021 石子合并 Label:Water DP

    N堆石子摆成一条线.现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的代价.计算将N堆石子合并成一堆的最小代价.   例如: 1 2 3 4,有 ...

  8. NYOJ737石子合并(二)-(区间dp)

    题目描述:     有N堆石子排成一排,每堆石子有一定的数量.现要将N堆石子并成为一堆.合并的过程只能每次将相邻的两堆石子堆成一堆,每次合并花费的代价为这两堆石子的和,经过N-1次合并后成为一堆.求出 ...

  9. P1880 [NOI1995]石子合并-(环形区间dp)

    https://www.luogu.org/problemnew/show/P1880 解题过程:本次的题目把石子围成一个环,与排成一列的版本有些不一样,可以在后面数组后面再接上n个元素,表示连续n个 ...

随机推荐

  1. grads 新老版本目录对比

    最近不少人都在使用OpenGrADS,最新的版本已经更新到了2.0.a9,具体grads做了哪些更新,在附件里面放了一个,是英文的. 很多人说在使用原来的一些教程的时候找不到相对应的文件夹了,其实仔细 ...

  2. 【笔记】H5自适应(待)

    参考: 1.盒子模型:http://www.cnblogs.com/sunyunh/archive/2012/09/01/2666841.html 2.浮动:http://www.w3school.c ...

  3. Web前端学习笔记之BootStrap

    Bootstrap介绍 Bootstrap是Twitter开源的基于HTML.CSS.JavaScript的前端框架. 它是为实现快速开发Web应用程序而设计的一套前端工具包. 它支持响应式布局,并且 ...

  4. zabbix监控nginx的性能

    1.nginx配置 需要使用zabbix监控nginx,首先nginx需要配置ngx_status,在nginx的配置文件中加入红框中的配置,然后重启nginx如下图所示: location /ngx ...

  5. 实验四 Android程序设计 实验报告 20162305李昱兴

    实验四 Android程序设计 实验报告 20162305李昱兴 一.Android Studio的安装测试 1.有关该软件 Android Studio,是基于Itellij IDEA的一款流行的I ...

  6. 砝码称重V2

    总时间限制:  1000ms 内存限制:  65536kB 描述 设有1g.2g.3g.5g.10g.20g的砝码各若干枚(其总重<=100,000),要求:计算用这些砝码能称出的不同重量的个数 ...

  7. Sharding-Jdbc实现分表分库

    Sharding-Jdbc分表分库LogicTable数据分片的逻辑表,对于水平拆分的数据库(表),同一类表的总称.订单信息表拆分为2张表,分别是t_order_0.t_order_1,他们的逻辑表名 ...

  8. Autofac Getting Started(默认的构造函数注入)

    https://autofaccn.readthedocs.io/en/latest/getting-started/index.html The basic pattern for integrat ...

  9. tyvj 1062 合并傻子 区间dp,典型模型石子归并

    P1062 合并傻子 时间: 1000ms / 空间: 131072KiB / Java类名: Main 背景 从前有一堆傻子,钟某人要合并他们~但是,合并傻子是要掉RP的...... 描述 在一个园 ...

  10. HDFS集群启动的常见问题

    hdfs集群启动的常见问题 1.用浏览器访问namenode的50070端口,不正常,需要诊断问题出在哪里: a.在服务器的终端命令行使用jps查看相关进程 观察节点是否存活 b.如果已经知道了启动失 ...