有很多种算法:

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. linux中相关服务不能访问的排错技巧

    Linux相关服务不能访问的排错步骤,以HTTP服务为例: 一.服务端排查思路: 1.检查SELinux是否关闭(针对CentOS6系统)  (1)临时关闭      setenforce 0  (2 ...

  2. SET 语句积累

    SET IDENTITY_INSERT 表名字 off 注解: 把值插入到自动编号(或者说是标识列,IDENTITY)中去,需要设定 SET IDENTITY_INSERT 语法:SET IDENTI ...

  3. 基于Bootstrap的日历控件和日期选择插件

    在线演示 本地下载

  4. SpringBoot中使用hikariCP

    本篇文章主要实现SpringBoot中使用hikariCP: 一 .使用工具 1. JDK1.8 2. springToolSuit(STS) 3. maven 二.创建项目 1.首先创建一个Spri ...

  5. Latex排版全解【转载】

    Latex排版全解 https://www.cnblogs.com/jingwhale/p/4250296.html

  6. ATCODER ABC 099

    ATCODER ABC 099 记录一下自己第一场AK的比赛吧...虽然还是被各种踩... 只能说ABC确实是比较容易. A 题目大意 给你一个数(1~1999),让你判断它是不是大于999. Sol ...

  7. ixgbe RSS原理分析

    这个月,一直在搞ixgbe RSS,希望能使得收包均衡,结果没成功,但是对网卡的收包原理理解得更深入些. 1.网卡硬件通过网线或者光纤收包. 2.网卡的RSS功能根据网络五元组计算得到32bit的ha ...

  8. geoserver源码maven编译相关问题

    1.登陆失败跳转404错误 登陆失败后指向的路径为: http://192.168.15.97:8080/hgisserver/web/wicket/bookmarkable/org.geoserve ...

  9. Bootstrap——优秀的开源前端框架

    Bootstrap是著名的社交网站.微博的先驱Twitter在2011年8月推出的开源WEB前端框架,集合CSS和HTML,使用了最新的浏览器技术,为快速WEB开发提供了一套前端工具包,包括布局.网格 ...

  10. MSSQL复制表操作

    1:复制表结构及数据到新表 select * into 目的数据库名.dbo.目的表名 from 原表名 select * into my0735home.dbo.infoMianTest from ...