四边形不等式是DP中的一个优化,做的几题状态转移方程都是f[i][j]=min(f[k][j-1]+w[k+1][i])(j-1<=k<i),不用优化的话,时间复杂度是O(n^3),用优化可达到O(n^2),而优化的实质就是证明其满足四边形不等式:k[i-1][j]<=k[i][j]<=k[i][j+1](或者k[i][j-1]<=k[i][j]<=k[i+1][j])(其中k[i][j]表示f[i][j]取的k).详细学习请见曹爽的论文:http://wenku.baidu.com/view/c44cd84733687e21af45a906.html
hdu3480Division将有n个元素的集合,划分成m个集合,使每个小集合中的最大值-最小值的平方和最小.最直接的想法肯定要对n个元素排序的,然后转移方程就是上面的了,k[i][j]的不等式也可以理解,不用另外怎么证。不过这题我开始一直MLE,因为我把w[i][j]存起来了,就超了,其实这可以直接算,不用存,然后就过了,不过memory还是很大。
pku1160post office怎么在一条直线上的n个村庄选m个村庄建邮局,使得每个村庄到最近邮局的总路程最少?如果用f[i][j]表示用j个邮局覆盖前i个村庄的话,f[i][j]=min(f[k][j-1]+w[k+1][i])(j-1<=k<i),w[i][j]表示用1个邮局覆盖i至j个村庄的最短路程和。四边形不等式也蛮显然的,而对于w[i][j],我开始以为是i和j村庄中间的位置,其实不是的,应该是i和j中间的村庄(下标是(i+j)/2)。
可以这样证明一下,如果ii,jj是i,j中间的相邻的两个村庄(其中ii靠i,jj靠j),那么选ii与jj的区别在于ii,jj间的这段路的数目的区别。假设ii右边的村庄数为m,那么选ii,ii,jj间的那段路的数目为m个,选jj,数目为n-m个,所以就比较n-m与m哪个大了。m大的话就选jj,n-m大的话就选ii.一开始选的是i(ii=i),那么如果某时刻ii后面的个数大于前面的(包括本身)个数,那么就后移一个(ii++),直到小于就结束,结束的条件就是ii-i+1>=j-ii,所以是中间的村庄(下标为(i+j)/2)。
hdu2829Lawrence输入n(<=1000)个数,将这n个数按原来的顺序分成m个集合,使得每个集合的任意两个数的乘积和相加最小。依然满足上面的状态转移方程,只不过w[i][j]表示i至j的任意两个数的乘积和,这个直接算需要O(n^4),优化成这个来算w[i][j]=w[1][j]-w[1][i-1]-sum[1][i-1]*sum[i][j](=sum[1][j]-sum[1][i-1]这可以线性得到).sum[1][i]可以直接算的,所以就解决了。同时w[i][j]=(sum[i][j]*sum[i][j]-squ[i][j])/2(其中squ[i][j]表示i至j的元素平方和)不过这要注意可能越界.
这几题的Memory都比较大,什么时候要想办法优化一下。。。