2012年3月12日
摘要: POJ_1160 我们可以用f[i][j]表示建好i个邮局时覆盖到第j个村庄的最优解,那么就可以得到f[i][j]=min{f[i-1][k]+w[k+1][j]}(k<j),其中w[x][y]表示建一个邮局覆盖x到y的村庄的距离和,w[x][y]可以事先预处理出来。 这个题目还可以用四边形不等式去优化,实际上四边形不等式优化难点不在于应用,只是在K[i][j-1]<=k<=K[i+1][j]中去选择更新f[i][j]的k即可,比较复杂的部分就在于对k可以这样选择做出证明。 一般四边形不等式的证明步骤如下: ①证明w为凸,这一步用黑书上的定理w为凸当且仅当w[i][j]+w[ 阅读全文
posted @ 2012-03-12 15:56 Staginner 阅读(3989) 评论(0) 推荐(0) 编辑
摘要: HDU_3045 这个题目如果一开始把各个值排序之后的话,就和POJ_3709那个题目基本一样了,只不过看discuss上说这个题目一开始读数据的时候就要用long long int。 剩下的工作就是和POJ_3709一样了,用斜率优化+单调队列的dp去做。#include<stdio.h>#include<string.h>#include<stdlib.h>#define MAXD 400010long long int a[MAXD], f[MAXD], A[MAXD];int N, K, q[MAXD];int cmp(const void *_p, 阅读全文
posted @ 2012-03-12 12:37 Staginner 阅读(375) 评论(0) 推荐(0) 编辑
摘要: POJ_1180 不妨设T[i]表示T1+T2+…+Ti,F[i]表示F1+F2+…+Fi,如果根据题目中的计算公式来算的话,就会得到f[i]=min{f[j]+(out[j]+S+T[i]-T[j])*(F[i]-F[j])},其中out[j]表示执行完j所在的batch的时间,这时我们就会发现状态转移方程中有两个变量f[j]、out[j],这样是没办法进行一维dp的。 然而我们换一个角度写dp方程,先将F[i]改成Fi+F(i+1)+…+Fn,这时可以得到另一种形式的状态转移方程f[i]=min{f[j]+(S+T[i]-T[j])*F[j+1]},也就是说执行batch j的花费看成不. 阅读全文
posted @ 2012-03-12 00:36 Staginner 阅读(340) 评论(0) 推荐(0) 编辑