【整理】石子合并问题(四边形不等式DP优化)
有很多种算法:
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优化)的更多相关文章
- 区间DP石子合并问题 & 四边形不等式优化
入门区间DP,第一个问题就是线性的规模小的石子合并问题 dp数组的含义是第i堆到第j堆进行合并的最优值 就是说dp[i][j]可以由dp[i][k]和dp[k+1][j]转移过来 状态转移方程 dp[ ...
- 石子合并(四边形不等式优化dp) POJ1160
该来的总是要来的———————— 经典问题,石子合并. 对于 f[i][j]= min{f[i][k]+f[k+1][j]+w[i][j]} From 黑书 凸四边形不等式:w[a][c]+w[b][ ...
- [HDU3516] Tree Construction [四边形不等式dp]
题面: 传送门 思路: 这道题有个结论: 把两棵树$\left[i,k\right]$以及$\left[k+1,j\right]$连接起来的最小花费是$x\left[k+1\right]-x\left ...
- [HDU3480] Division [四边形不等式dp]
题面: 传送门 思路: 因为集合可以无序选择,所以我们先把输入数据排个序 然后发先可以动归一波 设$dp\left[i\right]\left[j\right]$表示前j个数中分了i个集合,$w\le ...
- [POJ1160] Post Office [四边形不等式dp]
题面: 传送门 思路: dp方程实际上很好想 设$dp\left[i\right]\left[j\right]$表示前$j$个镇子设立$i$个邮局的最小花费 然后状态转移: $dp\left[i\ri ...
- 记忆的轮廓 期望 四边形不等式dp|题解
记忆的轮廓 题目描述 通往贤者之塔的路上,有许多的危机.我们可以把这个地形看做是一颗树,根节点编号为1,目标节点编号为n,其中1-n的简单路径上,编号依次递增,在[1,n]中,一共有n个节点.我们把编 ...
- 51Nod 1021 石子合并 Label:Water DP
N堆石子摆成一条线.现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的代价.计算将N堆石子合并成一堆的最小代价. 例如: 1 2 3 4,有 ...
- NYOJ737石子合并(二)-(区间dp)
题目描述: 有N堆石子排成一排,每堆石子有一定的数量.现要将N堆石子并成为一堆.合并的过程只能每次将相邻的两堆石子堆成一堆,每次合并花费的代价为这两堆石子的和,经过N-1次合并后成为一堆.求出 ...
- P1880 [NOI1995]石子合并-(环形区间dp)
https://www.luogu.org/problemnew/show/P1880 解题过程:本次的题目把石子围成一个环,与排成一列的版本有些不一样,可以在后面数组后面再接上n个元素,表示连续n个 ...
随机推荐
- url末尾的斜杠作用探秘
今天突然好奇,想区分www.abc.com/efg 和www.abc.com/efg/这两个网址的区别.即分析一下url末尾加个斜杠是否有特殊的效果. 找到网上的介绍: 当Web服务器接收到对某个末尾 ...
- LigerUI v1.2.4 LigerGrid 横轴滚动条
1.设置隐藏列的宽度,不要等于0 2.设置body样式添加overflow: hidden;
- Dispose 与 close 方法 的区别
Dispose : 释放 托管 与 非托管资源. Finalize : 释放 非托管资源. Close: 关闭资源后,可以再次使用资源.
- 【学习ffmpeg】打开视频文件,帧分析,并bmp保存关键帧
http://www.tuicool.com/articles/jiUzua http://blog.csdn.net/code_future/article/details/8646717 主题 ...
- Oracle11g:分区表数据操作出现ORA-14400异常处理
Oracle11g:分区表数据操作出现ORA-14400异常处理 问题: 当对已分区的表数据进行操作(例如新增,修改),出现异常提示: ORA: 插入的分区关键字未映射到任何分区 分析: 意思说的是插 ...
- article标准用法
article代表一个在文档.页面或者网站中自成一体的内容 其目的是为了让开或重用 譬如论坛的帖子.博客的文章.一片用户的评论.一个互动的widget小工具 article 会有一个标题(通常在hea ...
- [pixhawk笔记]3-架构概览
本文主要内容翻译自:https://dev.px4.io/en/concept/architecture.html 总体架构: PX4代码由两层组成:PX4飞行栈和PX4中间件.其中,前者是一套飞行控 ...
- No module named bz2
yum install bzip* python2.6 import bz2 python2.7 import bz2 error 解决:sudo cp /usr/lib64/python2.6/li ...
- Linux常用监控命令
A goal is a dream with a deadline. Much effort, much prosperity. 1.IOSTAT命令 此命令安装包为sysstat 可用yu ...
- Your app uses or references the following non-public APIs的解决方案
之前接了一个旧的项目,代码混乱,年代久远,不得不吐槽一波,好不容易改完需求提交代码,说用到了non-public APIs,搞了好久终于找到地方了,下面是我的解决过程,让大家少走弯路: 下面的被驳回的 ...