DP:四边形不等式优化 Optimization of Quadrilateral Inequality

定义1:当决策代价函数w满足w[a, c]+w[b, d]<=w[a, d]+w[b, c](a<=b<=c<=d)时,称w满足四边形不等式

定义2:当函数w满足w[b, c]<=w[a, d](a<=b<=c<=d)时,称w关于区间包含关系单调

如果状态转移方程dp[i, j] = min{dp[i, k-1]+dp[k, j]}+w[i, j](i<k<=j)且w满足四边形不等式,则有

定理1:上式dp满足四边形不等式。

定理2:令让dp[i, j]取最小值的k为K[i, j],则有K[i, j-1]<=K[i, j]<=K[i+1, j]。


定理1证明:设k=K[b, c],则 dp[a, c] + dp[b, d] <= dp[a, k-1] + dp[k, c] + w[a, c] + dp[b, k-1] + dp[k, d] + w[b, d]

  <= dp[a, k-1] + dp[k, d] + w[a, d] + dp[b, k-1] + dp[k, c] + w[b, c]

  = dp[a, d] + dp[b, c]


定理2证明:设k=K[i, j-1],令i<k‘<k<j-1<j,根据定理1,则有

dp[k‘, j-1] + dp[k, j] <= dp[k‘, j] + dp[k, j-1]

记S[k, i, j]=w[i, j] + dp[i, k-1] + dp[k, j],不等式两侧同时加上w[i, j-1] + w[i, j] + dp[i, k-1] + dp[i, k‘-1],可得

S[k‘, i, j-1] + S[k, i, j] <= S[k‘, i, j] + S[k, i, j-1]

根据k的定义,显然有S[k, i, j-1]<=S[k‘, i, j],故有S[k, i, j]<=S[k‘, i, j],所以k‘不可能是K[i,j],因此K[i, j]>=K[i, j-1]。

同理可得K[i, j]<=K[i+1, j]。


由于推出了最优决策K的单调性,从而可以减少每个状态转移的状态数,将复杂度从O(N^3)优化到O(N^2)。做法是:按照j-i划分阶段来求K[i, j]。显然根据j-i的长度有N个阶段,不妨设每个阶段枚举的长度(j-i)为d。求K[i, j]的复杂度是O(K[i+1, j]-K[i, j-1]+1),则第d个阶段(即计算K[1, 1+d] 到K[n-d, n])复杂度O(K[n-d+1, n] - K[1,d] +n-d)<=O(N)。故总时间复杂度为O(N^2)。

最终方程变为dp[i, j] = min{dp[i, k-1]+dp[k, j]}+w[i, j](K[i, j-1]<k<=K[i+1, j])。

伪代码:

for (int i=1;i<=n;i++) {
	K[i][i] = i;
	dp[i][i] = p[i];
	sum[i] = sum[i-1] + p[i];
}
for (int l=2;l<=l;l++) //枚举长度
	for (int i=1;i<=n-l+1;i++) {	//枚举首指针
		int j = i+l-1;	//尾指针
		dp[i][j] = maxw;
		for (int k=K[i][j-1];k<=K[i+1][j];k++)
			if (dp[i][j] > dp[i][k-1]+dp[k][j]) {
				dp[i][j] = dp[i][k-1]+dp[k][j];
				K[i][j] = k;
			}
		dp[i][j] += sum[j]-sum[i-1];
	}


DP:四边形不等式优化 Optimization of Quadrilateral Inequality

上一篇:小白dp 10626 - Buying Coke


下一篇:iOS多线程系列(2)