四边形不等式优化

来源:互联网 发布:兰芝淘宝旗舰店 编辑:程序博客网 时间:2024/03/29 01:48
当函数w(i,j)满足 w(a,c)+w(b,d)<=w(b,c)+w(a,d) 且a<=b<c<=d 时,我们称w(i,j)满足四边形不等式。
当函数w(i,j)满足 w(i',j)<=w(i,j')且 i<=i'<j<=j' 时,称w关于关于区间包含关系单调。
s(i,j)=k是指m(i, j)这个状态的最优决策


最优代价d[i,j]=min{d[i,k-1]+d[k+1,j]}+w[i,j]
其中w[i,j]=sum[i,j]
四边形不等式:w[a,c]+w[b,d]<=w[b,c]+w[a,d](a<b<c<d) 就称其满足凸四边形不等式
决策单调性:w[i,j]<=w[i',j']   (i'<=i<j<=j')


于是有以下三个定理


定理一: 如果w[i,j]同时满足四边形不等式 和 决策单调性 ,则d[i,j]也满足四边形不等式
定理二:当定理一的条件满足时,让d[i,j]取最小值的k为s[i,j],则s[i,j-1]<=s[i,j]<=s[i+1,j]
定理三:w为凸当且仅当w[i,j]+w[i+1,j+1]<=w[i+1,j]+w[i,j+1]


由定理三知 判断w是否为凸即判断 w[i,j+1]-w[i,j]的值随着i的增加是否递减

于是求k值的时候s[i,j]只和s[i,j-1] 和 s[i+1,j]有关,所以可以以i-j递增为顺序递推各个状态值最终求得结果,将O(n^3)转为O(n^2)

for(int i = 1; i <= n; i++) {    dp[i][i] = 0;    s[i][i] = i;}for(int l = 1; l < n; l++) {    for(int i = 1; i + l <= n; i++) {        int j = i + l;        dp[i][j] = INF;        for(int k = s[i][j - 1]; k <= s[i + 1][j]; k++) {            if(dp[i][k] + dp[k + 1][j] + cal(i, j, k) <= dp[i][j]) {                dp[i][j] = dp[i][k] + dp[k + 1][j] + cal(i, j, k);                s[i][j] = k;            }        }    }}


0 0
原创粉丝点击