四边形不等式优化
- 引理1(可直接用来判断):满足定义和单调性
- 引理2:
s[i][j]
= k为dp[i][j]
取得最优值k,如果dp[i][j]
满足四边形不等式,那么有s[i][j - 1] <= k <= s[i + 1][j]
四边形不等式定义1:
设w是定义在整数集合上的二元函数,对于任意整数i<= i’ <= j <= j’,如果有w(i, j) + w(i’ + j’) <= w(i, j’) + w(i’, j),则w满足四边形不等式。
四边形不等式定义2:
对于整数i < i + 1 <= j < j + 1,如果有w(i, j) + w(i + 1, j + 1) <= w(i, j + 1) + w(i + 1, j),则满足四边形不等式。
单调性:
大区间包含小区间,那么大区间的w值大于或等于小区间的w值
int n;
int w[N]; // 价格 w[i][j] 表示从i~j的合价格
int dp[N][N]; // dp数组
int s[N][N]; // 范围
void solve() {
for(int i = 1; i <= n; i++) {
dp[i][i] = 0;
s[i][i] = i; // s[][]的初始值
}
for(int len = 2; len <= n; len++) {
for(int i = 1; i <= n - len + 1; i++) {
int j = i + len - 1;
for(int k = s[i][j - 1]; k <= s[i + 1][j]; k++) { // 缩小循环范围
if(dp[i][j] > dp[i][k] + dp[k + 1][j] + w[i][j]) { // 是否更优
dp[i][j] = dp[i][k] + dp[k + 1][j] + w[i][j];
s[i][j] = k; // 更新最佳分割点
}
}
}
}
}