题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1022

基准时间限制:1 秒 空间限制:131072 KB 分值: 160 难度:6级算法题
 收藏
 关注
N堆石子摆成一个环。现要将石子有次序地合并成一堆。规定每次只能选相邻的2堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的代价。计算将N堆石子合并成一堆的最小代价。
 
例如: 1 2 3 4,有不少合并方法
1 2 3 4 => 3 3 4(3) => 6 4(9) => 10(19)
1 2 3 4 => 1 5 4(5) => 1 9(14) => 10(24)
1 2 3 4 => 1 2 7(7) => 3 7(10) => 10(20)
 
括号里面为总代价可以看出,第一种方法的代价最低,现在给出n堆石子的数量,计算最小合并代价。
 
Input
第1行:N(2 <= N <= 1000)
第2 - N + 1:N堆石子的数量(1 <= A[i] <= 10000)
Output
输出最小合并代价
Input示例
4
1
2
3
4
Output示例
19
 
 
题解:
1. 一开始想到的是:dp[l][r] = min(dp[l][k]+dp[k+1][r]+w[l][r]), l<=k<r 的区间DP,但时间复杂度为O(n^3),而n<=1e3,所以无法通过。
2. 然后需要四边形不等式进行优化,四边形不等式优化DP的结论请看:传送门
3. 优化后:dp[l][r] = min(dp[l][k]+dp[k+1][r]+w[l][r]), s[l][r-1]<=s[l][r]<=s[l+1][r],即s[l][r-1]<=k<=s[l+1][r]
 
w[][]数组需要满足满足的条件:
1) 区间包含单调性:被包含的区间的值小于等于包含的区间的值。
2) 四边形不等式:交叉区间之和小于等于被包含区间加包含区间的值
 
 
 
代码如下:
 #include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <string>
#include <set>
using namespace std;
typedef long long LL;
const int INF = 2e9;
const LL LNF = 9e18;
const int MOD = 1e9+;
const int MAXN = 2e3+; int dp[MAXN][MAXN], sum[MAXN], w[MAXN][MAXN], s[MAXN][MAXN];
int main()
{
int n;
while(scanf("%d", &n)!=EOF)
{
sum[] = ;
for(int i = ; i<=n; i++) //因为初始时为环(而非一行),所以复制多一份到后面,
scanf("%d",&sum[i]), sum[n+i] = sum[i]; for(int i = ; i<*n; i++) //求前缀和
sum[i] += sum[i-]; for(int l = ; l<*n; l++) //求出每一段区间,最后一次合并所花费的代价(必为质量和)
for(int r = l; r<*n; r++)
w[l][r] = sum[r]-sum[l-]; for(int i = ; i<*n; i++) //初始化单位区间
dp[i][i] = , s[i][i] = i; for(int len = ; len<=n; len++) //递推
for(int l = ; l+len-<*n; l++)
{
int r = l+len-;
dp[l][r] = INF;
for(int k = s[l][r-]; k<=s[l+][r]; k++)
if(dp[l][r]>dp[l][k]+dp[k+][r]+w[l][r]) //四边形不等式优化
{
dp[l][r] = dp[l][k]+dp[k+][r]+w[l][r];
s[l][r] = k;
}
}
int ans = INF;
for(int l = ; l<=n; l++) //枚举起点,取最小值
ans = min(ans, dp[l][l+n-]);
printf("%d\n", ans);
}
}

 

51nod 1022 石子归并 V2 —— DP四边形不等式优化的更多相关文章

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

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

  2. Codevs 3002 石子归并 3(DP四边形不等式优化)

    3002 石子归并 3 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题目描述 Description 有n堆石子排成一列,每堆石子有一个重量w[i], 每次 ...

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

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

  4. codevs3002石子归并3(四边形不等式优化dp)

    3002 石子归并 3 参考 http://it.dgzx.net/drkt/oszt/zltk/yxlw/dongtai3.htm  时间限制: 1 s  空间限制: 256000 KB  题目等级 ...

  5. P1880 [NOI1995]石子合并[区间dp+四边形不等式优化]

    P1880 [NOI1995]石子合并 丢个地址就跑(关于四边形不等式复杂度是n方的证明) 嗯所以这题利用决策的单调性来减少k断点的枚举次数.具体看lyd书.这部分很生疏,但是我还是选择先不管了. # ...

  6. 51nod 1022 石子归并 环形+四边形优化

    1022 石子归并 V2 基准时间限制:1 秒 空间限制:131072 KB 分值: 160 难度:6级算法题  收藏  关注 N堆石子摆成一个环.现要将石子有次序地合并成一堆.规定每次只能选相邻的2 ...

  7. CSP 201612-4 压缩编码 【区间DP+四边形不等式优化】

    问题描述 试题编号: 201612-4 试题名称: 压缩编码 时间限制: 3.0s 内存限制: 256.0MB 问题描述: 问题描述 给定一段文字,已知单词a1, a2, …, an出现的频率分别t1 ...

  8. 区间dp+四边形不等式优化

    区间dp+四边形优化 luogu:p2858 题意 给出一列数 \(v_i\),每天只能取两端的数,第 j 天取数价值为\(v_i \times j\),最大价值?? 转移方程 dp[i][j] :n ...

  9. HDU 3516 DP 四边形不等式优化 Tree Construction

    设d(i, j)为连通第i个点到第j个点的树的最小长度,则有状态转移方程: d(i, j) = min{ d(i, k) + d(k + 1, j) + p[k].y - p[j].y + p[k+1 ...

随机推荐

  1. oracle手动修改listener.ora和tnsnames.ora之后竟然无效

    oracle手动修改listener.ora和tnsnames.ora之后竟然无效 花式重启都没有生效,需要使用Net Configuration Assistant来进行刷一下,重新生成的监听还是一 ...

  2. vue install 注册组件

    1.myPlugin.js文件 let MyPlugin = {}; MyPlugin.install = function (Vue, options) { // 1. 添加全局方法或属性 Vue. ...

  3. [Android]egit取消文件版本号控制

    开发项目,多人合作开发变得越来越重要了,在此同一时候,使用git作为协同工具也是越来越多.在此.介绍一下egit取消文件版本号控制的方法. (egit即为eclipse中的git插件) 1.打开Nav ...

  4. 结构体定义:struct与typedef struct

    https://blog.csdn.net/haiou0/article/details/6877718?tdsourcetag=s_pcqq_aiomsg https://blog.csdn.net ...

  5. 开发ActiveX控件调用另一个ActiveX系列2——调试ActiveX

    关于调试ActiveX控件,有若干方法,例如可以建一个MFC工程调用调试,我则倾向于使用附加到浏览器进程,因为浏览器才是真正运行的环境. 打开加载ActiveX的目标页面,当然希望我们的调试内容不是自 ...

  6. 非标准USBasp下载线烧录Arduino BootLoader的参数设置

    本文仅适用于BootLoader损坏且买到国产“免驱USBasp下载线”导致Arduino IDE无法识别从而不能烧写的情况.是一种略显非主流的操作方式. 因为Arduino的IDE并不支持这种免驱的 ...

  7. Spring利用propertyConfigurer类 读取.property数据库配置文件

    (1).基本的使用方法是: <bean id="propertyConfigurerForAnalysis" class="org.springframework. ...

  8. Spark Streaming和Kafka整合开发指南(二)

    在本博客的<Spark Streaming和Kafka整合开发指南(一)>文章中介绍了如何使用基于Receiver的方法使用Spark Streaming从Kafka中接收数据.本文将介绍 ...

  9. JavaScript读书笔记(6)-Array RegExp

    1.Array类型 ECMAScript数组的每一项可以保存任何类型的数据,数组的大小也可以动态调整: (1) 创建数组 第一种方式:Array构造函数 var colors=new Array(); ...

  10. poj1206(dp)

    题目链接:http://poj.org/problem?id=1260 Pearls Time Limit: 1000MS   Memory Limit: 10000K Total Submissio ...