POJ1160 Post Office-四边形不等式优化DP
方程
$\Large f(i,j)=min(f(i-1,k)+w(k+1,j))$
其中$w(i,j)$表示在$[i,j]$的村庄都去一个邮局的最小距离和
证明w满足四边形不等式
设$w_k(i,j)$表示$[i,j]$的村庄都去$k$村庄邮局的距离和
对于$\forall k$满足$w_k(i,j+1)=w(i,j+1)$都有$w_k(i+1,j)=w(i+1,j)$
(因为k只有选$i,j$的中间位置$w(i,j)$才是最小的)
$w(i,j)+w(i+1,j+1)\le w_k(i,j)+w_k(i+1,j+1)=w(i,j+1)+w(i+1,j)$
证明f满足四边形不等式
设$f_k(i,j)=f(i-1,k-1)+w(k,j)$
对于$\forall i\le i^{'}\le j\le j^{'}$,设$k=s(i,j^{'}),t=s(i^{'},j)$
1.如果$k\le t$
有$f(i,j)+f(i^{'},j^{'})\le f_k(i,j)+f_t(i^{'},j^{'})= f(i-1,k-1)+w(k,j)+f(i^{'}-1,t-1)+w(t,j^{'})$
因为w满足四边形不等式$f(i,j)+f(i^{'},j^{'})\le f(i-1,k-1)+w(k,j^{'})+f(i^{'}-1,t-1)+w(t,j)$
即$f(i,j)+f(i^{'},j^{'})\le f(i,j^{'})+f(i^{'},j)$
2.如果$k\gt t$
则只需证$f(i-1,t-1)+w(t,j)+f(i^{'}-1,k-1)+w(k,j^{'})\le f(i-1,k-1)+w(k,j^{'})+f(i^{'}-1,t-1)+w(t,j)$
设$k_1=s(i-1,k-1),k_2=s(i-2,k_1-1)……k_n=s(i-n,k_{n-1}-1)$
$t_1=s(i^{'}-1,t-1),t_2=s(i^{'}-2,t_1-1)……t_n=s(i^{'}-n,t_{n-1}-1)$
如果$k_1\le t_1$,就可以用上面的证明方法证出来
否则,递归本次证明直到得到求证$f(1,t_n-1)+f(i_{'}-i+1,k_n-1)\le f(1,k_n-1)+f(i_{'}-i+1,t_n-1)$
化简得$w(1,t_n-1)+f(i_{'}-i,t_{n+1}-1)+w(t_{n+1},k_n-1)\le w(1,k_n-1)+f(i_{'}-i,t_{n+1}-1)+w(t_{n+1},t_n-1)$
由w满足四边形不等式得$w(1,t_n-1)+w(t_{n+1},k_n-1)\le w(1,k_n-1)+w(t_{n+1},t_n-1)$
所以$f(i,j)+f(i^{'},j^{'})\le f(i,j^{'})+f(i^{'},j)$
证明$f(i,j)$的决策$s(i,j)$是单调的
1.设$k=s(i,j)$,对于所有$t\le k$
有$w(t,j)+w(k,j+1)\le w(t,j+1)+w(k,j)$
两边同时加上$f(i,t-1)+f(i,k-1)$得$f_t(i,j)+f_k(i,j+1)\le f_k(i,j)+f_t(i,j+1)$
因为$f_t(i,j)\ge f_k(i,j)$,所以$f_k(i,j+1)\le f_t(i,j+1)$
所以$s(i,j)\le s(i,j+1)$
2.设$k=s(i,j)$,对于所有$t\le k$
有$f(i,t-1)+f(i+1,k-1)\le f(i+1,t-1)+f(i,k-1)$
两边同时加上$w(t,j)+w(k,j)$得$f_t(i,j)+f_k(i+1,j)\le f_k(i,j)+f_t(i+1,j)$
因为$f_t(i,j)\ge f_k(i,j)$,所以$f_k(i+1,j\le f_t(i+1,j)$
所以$s(i,j)\le s(i+1,j)$
代码
#include<cstdio>
#include<cstring>
using namespace std;
#define maxn 305
#define maxp 40
int f[maxp][maxn],s[maxp][maxn],w[maxn][maxn],a[maxn];
int main(){
memset(f,0x3f,sizeof(f));
int n,p;scanf("%d%d",&n,&p);
for(int i=;i<=n;i++)scanf("%d",a+i);
for(int i=;i<=n;i++){
for(int j=i+;j<=n;j++){
w[i][j]=w[i][j-]+a[j]-a[(i+j)/];
}
s[][i]=;
}
f[][]=;
for(int i=;i<=p;i++){
f[i][i]=;s[i][i]=i;s[i][n+]=n;
for(int j=n;j>i;j--){
for(int k=s[i-][j];k<=s[i][j+];k++){
if(f[i][j]>f[i-][k-]+w[k][j]){
f[i][j]=f[i-][k-]+w[k][j];s[i][j]=k;
}
}
}
}
printf("%d",f[p][n]);
return ;
}
POJ1160 Post Office-四边形不等式优化DP的更多相关文章
- POJ 1160 Post Office (四边形不等式优化DP)
题意: 给出m个村庄及其距离,给出n个邮局,要求怎么建n个邮局使代价最小. 析:一般的状态方程很容易写出,dp[i][j] = min{dp[i-1][k] + w[k+1][j]},表示前 j 个村 ...
- 【转】斜率优化DP和四边形不等式优化DP整理
(自己的理解:首先考虑单调队列,不行时考虑斜率,再不行就考虑不等式什么的东西) 当dp的状态转移方程dp[i]的状态i需要从前面(0~i-1)个状态找出最优子决策做转移时 我们常常需要双重循环 (一重 ...
- hdu 2829 Lawrence(四边形不等式优化dp)
T. E. Lawrence was a controversial figure during World War I. He was a British officer who served in ...
- BZOJ1563/洛谷P1912 诗人小G 【四边形不等式优化dp】
题目链接 洛谷P1912[原题,需输出方案] BZOJ1563[无SPJ,只需输出结果] 题解 四边形不等式 什么是四边形不等式? 一个定义域在整数上的函数\(val(i,j)\),满足对\(\for ...
- codevs3002石子归并3(四边形不等式优化dp)
3002 石子归并 3 参考 http://it.dgzx.net/drkt/oszt/zltk/yxlw/dongtai3.htm 时间限制: 1 s 空间限制: 256000 KB 题目等级 ...
- CF321E Ciel and Gondolas Wqs二分 四边形不等式优化dp 决策单调性
LINK:CF321E Ciel and Gondolas 很少遇到这么有意思的题目了.虽然很套路.. 容易想到dp \(f_{i,j}\)表示前i段分了j段的最小值 转移需要维护一个\(cost(i ...
- POJ 1160 四边形不等式优化DP Post Office
d(i, j)表示用i个邮局覆盖前j个村庄所需的最小花费 则有状态转移方程:d(i, j) = min{ d(i-1, k) + w(k+1, j) } 其中w(i, j)的值是可以预处理出来的. 下 ...
- HDU 2829 Lawrence (斜率优化DP或四边形不等式优化DP)
题意:给定 n 个数,要你将其分成m + 1组,要求每组数必须是连续的而且要求得到的价值最小.一组数的价值定义为该组内任意两个数乘积之和,如果某组中仅有一个数,那么该组数的价值为0. 析:DP状态方程 ...
- 四边形不等式优化DP——石子合并问题 学习笔记
好方啊马上就要区域赛了连DP都不会QAQ 毛子青<动态规划算法的优化技巧>论文里面提到了一类问题:石子合并. n堆石子.现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆石子合并成新的 ...
- 石子合并(四边形不等式优化dp) POJ1160
该来的总是要来的———————— 经典问题,石子合并. 对于 f[i][j]= min{f[i][k]+f[k+1][j]+w[i][j]} From 黑书 凸四边形不等式:w[a][c]+w[b][ ...
随机推荐
- unity 移动
上下左右平移 void Start() { QualitySettings.vSyncCount = ; Application.targetFrameRate = ;//控制帧数 } // Upda ...
- Day 7 :一句话Python(匿名函数-lambda,三元运算,列表表达式,生成器表达式)
注意: 1.所有的列表表达式都可以转换成生成器表达式 2.经量让标傲世简化你得操作,增加代码可读性 3.如果代码过于复杂,应该转换成普通代码 4.再代码中尽可能多使用生成器表达式. 三元运算符:简化代 ...
- IK 用java 代码实现分词
需要导入IK 对应的jar 包 IKAnalyzer2012.jar lucene-core-4.10.jar public static void main(String[] args) throw ...
- POJ 4718 /// 树链剖分+线段树区间合并 求树上两点间的LCIS长度
题目大意: 给定n个点 每个点都有权值 接下来给定树的n条边 第 i 个数 a[i] 表示 i+1到a[i]之间 有一条边 给定q q个询问 每次询问给出 x y 求x到y的最长上升子序列的长度 题解 ...
- mycat-zookeepr--mycatweb
##############################mycat镜像############################## 5-1 创mycat镜像 wget http://dl.myca ...
- Android代号、版本及API级别之间的对应关系
参考链接:Codenames, Tags, and Build Numbers | Android Open Source Project
- centOs 查看系统cpu使用率等--top
原文:centOs 查看系统cpu使用率等--top 在系统维护的过程中,随时可能有需要查看 CPU 使用率,并根据相应信息分析系统状况的需要.在 CentOS 中,可以通过 top 命令来查看 CP ...
- Nginx软件模块说明
Nginx软件模块说明 Nginx常用模块 注:以下只是列举Nginx常用模块,需要详细了解更多模块可以登录Nginx官方网站查看 功能模块 模块说明 ngx_http_core_module 包含一 ...
- Activiti学习笔记8 — UserTask私有任务的使用
每一个UserTask都会在Execution表和Task表中各产生一条记录 一.创建流程引擎对象 /** * 1.创建流程引擎对象 */ private ProcessEngine processE ...
- mysql查询小技巧
如果所传bookTypeName为空则执行select * from t_bookType(搜索框里未输入信息) 否则追加 and bookTypeName like '%"+bookTy ...