题目链接: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. Loadrunner 使用过程常见问题

    一.安装配置 解决LoadRunner参数化最多读取100个值数据限制的问题. 修改.\Program Files\HP\LoadRunner\config\ vugen.ini中[ParamTabl ...

  2. 有用PHP依赖管理工具Composer新手教程

    PHP依赖管理工具Composer新手教程 Composer 是 PHP 的一个依赖管理工具.它同意你申明项目所依赖的代码库,它会在你的项目中为你安装他们. 依赖管理 Composer 不是一个包管理 ...

  3. Android使用OKHttp3实现下载(断点续传、显示运行进度)

    OKHttp3是现在很流行的Android网络请求框架,那么怎样利用Android实现断点续传呢,今天写了个Demo尝试了一下,感觉还是有点意思 准备阶段 我们会用到OKHttp3来做网络请求,使用R ...

  4. C语言八进制和十六进制数

    一 赋值 int dex = 100;// 默认十进制 int oct = 0144;// 八进制,以0開始 int hex = 0x64;// 十六进制,以0x開始 二 输出 void show(i ...

  5. 利用DataSet部分功能实现网站登录

    using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.We ...

  6. mysql 配置 安装和 root password 更改

    第一步: 修改my.ini文件,替换为以下内容 (skip_grant_tables***重点) # For advice on how to change settings please see # ...

  7. node.js介绍及Win7环境安装测试(转)

    官网描述: Node.js is a platform built on Chrome's JavaScript runtime for easily building fast, scalable ...

  8. ETL拉链算法汇总大全

    拉链算法总结大全: 一.0610算法(追加) 1.删除仓库表的载入日期是本次载入日期的数据,以支持重跑 delete from xxx where start_dt >=$tx_date; 2. ...

  9. linux中下载JDK 1.7

    今天想linux下安装java,然后就使用wget来下载jdk1.7,结果老是报错,大概意思是cookie有问题.如下图: 然后网上看了一下,下面的地址可以下载: wget --no-cookies ...

  10. 安装部署Solrcloud

    实验说明: 三台虚拟机做solrcloud集群                            安装solr前请确保jdk .tomcat.zookeeper已安装好,否则无法启动 三台虚拟机I ...