四边形不等式优化区间DP

四边形不等式优化

  • 引理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; // 更新最佳分割点
				}
			}
		}
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值