区间DP

区间DP

学完线性DP,接着来学区间DP
区间DP更像是线性DP的拓展,在阶段中的dp,由前一个阶段来决定
区间DP的特征:
1.合并两个或者多个区间
2.可以将问题分成两个或者多个区间
3.对整个问题设最优值,枚举合并的点,将问题分解最后将两个部分的最优值合并得到原问题,有点类似线段树
沿着阶段的扩张某个方向递推,直到计算出目标状态
他是以区间的长度作为阶段,使用两个端点(左右边界)描述每一个区间,区间DP,一个状态由若干个比它更小并且包含它的区间代表的状态转移过来,所以区间DP的决策就是对区间一个划分,学习完区间,树状DP会更好理解
这些类型的DP都很类似
板子代码

for(int i=1;i<=n;i++)//枚举长度 
{
	for(int j=1;j+i<=n+1;j++)//枚举起点 
	{
		int end=j+i-1;
		for(int k=j;j<end;j++)//枚举分割点,更新小区间最优解
		{
			f[j][end]=min(f[j][end],f[j][k]+f[k+1][end]+some);
		 } 
	}
}

石头合并
如果最一开始的时候第l石头和第r石头被合并,那么说明l~r之间的每一堆石头都已经被合并,那么他们才有可能相邻,那么在任意一个石头都可以用[l,r]来表示,表示最初是合并而成的

memsmet(f,inf,sizeof(f));
for(int i=1;i<=n;i++)
{
	f[i][i]=0;
	sum[i]=sum[i-1]+a[i];//求前缀和
}
for(int len=2;len<=n;len++)
{
	for(int l=1;l<=n-len+1;l++)
	{
		int r=l+len-1;
		for(int k=l;k<r;k++)
			f[l][r]=min(f[l][r],f[l][k]+f[k+1][r]);
		f[l][r]+=sum[r]-sum[l-1];
	}
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值