区间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];
}
}
1233

被折叠的 条评论
为什么被折叠?



