有很多种算法:

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. java注解1

    http://computerdragon.blog.51cto.com/6235984/1210969 http://blog.csdn.net/it_man/article/details/440 ...

  2. LCD控制器与帧率、刷新率的关系分析

    源:LCD控制器与帧率.刷新率的关系分析 LCM之Fmark功能 && LCD控制器同LCD驱动器的差别 && 帧率与刷新率的关系 && OLED背光

  3. 【Head First Servlets and JSP】笔记

    1.谈到服务器的时候,可能是指物理主机(硬件),也可能是指Web服务应用(软件). 2.谈到客户的时候,通常指人类用户,或者是浏览器应用,或者两者都包括,浏览器应用做些什么?发送请求.解释HTML和呈 ...

  4. maven私服客户端配置

    <?xml version="1.0" encoding="UTF-8"?> <settings xmlns="http://mav ...

  5. Python3.x:日期库dateutil简介

    Python3.x:日期库dateutil简介 安装 pip install python-dateutil 关于parser #字符串可以很随意,可以用时间日期的英文单词,可以用横线.逗号.空格等做 ...

  6. React Native之持久化存储(AsyncStorage、react-native-storage)的使用

    AsyncStorage是一个简单的.异步的.持久化的Key-Value存储系统,它对于App来说是全局性的.这是官网上对它的介绍.可以知道,这个asyncstorage也是以键值对的形式进行存储数据 ...

  7. [SCOI2005]扫雷Mine

    1088: [SCOI2005]扫雷Mine Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2028  Solved: 1187[Submit][St ...

  8. Caffe python利用classify.py实现对单通道(灰度图)的数据进行分类

    比如你在mnist的prototxt中定义图输入是单通道的,也就是channel=1,然后如果直接调用classify.py脚本来测试的话,是会报错,错误跟一下类似. Source param sha ...

  9. 第一篇:Spark SQL源码分析之核心流程

    /** Spark SQL源码分析系列文章*/ 自从去年Spark Submit 2013 Michael Armbrust分享了他的Catalyst,到至今1年多了,Spark SQL的贡献者从几人 ...

  10. contos LAMP环境搭建

    LINUX搭建LAMP笔记 .YUM:Yum(全称为 Yellow dog Updater, Modified)是一个在Fedora和RedHat以及CentOS中的Shell前端软件包管理器.基于R ...