四边形不等式

区间dp问题,状态转移方程:

dp[i][j] = min( dp[i][k] + dp[k+1][j] +w[i][j] ) //w[i][j]是从i到j的,一个定值 不随k改变,而且w的值只和i j有关,是它们的二元函数。

其中i<=k<=j ,初始值dp[i][i]已知。

含义:

dp[i][j]是状态i到j的最小花费。

dp[i][k] + dp[k+1][j]体现递推关系,k在i和j之间滑动,k有一个最优值使dp最小。

w[i][j]的性质很重要!w[i][j]是和题目有关的费用,如果满足四边形不等式和单调性,那么用DP计算dp时,就可以用四边形不等式进行优化。

看w函数,

单调性:【如果大区间包含小区间,那么大区间的w值也大于】

四边形不等式:

i,i',j,j' w[i,j]+w[i',j']<=w[i,j']+w[i',j] 交叉区间的和<=大区间和小区间的和

如果w满足单调性和四边形不等式的话,dp也满足。

dp[i][j]的最优分割点记为s[i][j],那么 s[i][j-1] <= s[i][j] <=s[i+1][j]

打表观察是否满足:

#include<cstdio>
#include<iostream>
#include<cstring>
#include<vector>
#include<algorithm>
#include<map>
#include<cmath>
#include<queue>
using namespace std;
int w(int i,int j)
{
	//具体问题具体分析 
} 
int main()
{
	bool flag=true;
	//验证单调性 
	for(int l=1;l<=n;l++)
	for(int r=l+2;r<=n;r++)
	for(int i=l;i<=r;i++)
	for(int j=i;j<=r;j++)
		if(w(i,j)>w(l,r)) flag=false;
	//验证四边形不等式 
	for(int l=1;l<=n;l++)
	for(int r=l+2;r<=n;r++)
		if(w(l,r-1)+w(l+1,r)>w(l,r)+w(l+1,r-1)) flag=false;
	if(flag) //符合单调性以及四边形不等式
	else   //不符合单调性以及四边形不等式
	return 0; 
} 
相关推荐
shymoy27 分钟前
Radix Sorts
数据结构·算法·排序算法
风影小子35 分钟前
注册登录学生管理系统小项目
算法
黑龙江亿林等保38 分钟前
深入探索哈尔滨二级等保下的负载均衡SLB及其核心算法
运维·算法·负载均衡
lucy1530275107940 分钟前
【青牛科技】GC5931:工业风扇驱动芯片的卓越替代者
人工智能·科技·单片机·嵌入式硬件·算法·机器学习
杜杜的man1 小时前
【go从零单排】迭代器(Iterators)
开发语言·算法·golang
小沈熬夜秃头中୧⍤⃝1 小时前
【贪心算法】No.1---贪心算法(1)
算法·贪心算法
木向2 小时前
leetcode92:反转链表||
数据结构·c++·算法·leetcode·链表
阿阿越2 小时前
算法每日练 -- 双指针篇(持续更新中)
数据结构·c++·算法
skaiuijing2 小时前
Sparrow系列拓展篇:对调度层进行抽象并引入IPC机制信号量
c语言·算法·操作系统·调度算法·操作系统内核
Star Patrick2 小时前
算法训练(leetcode)二刷第十九天 | *39. 组合总和、*40. 组合总和 II、*131. 分割回文串
python·算法·leetcode