
用 f[i][j]f[i][j]f[i][j] 表示从 iii 列到 jjj 列能够得到的最大值,枚举中间某列 kkk,使这一列尽可能多地放 111(根据每个区间的左右来进行判断),然后就是个区间DP
#include<iostream>
#include<cstdio>
#define MAXN 105
using namespace std;
int n,m,k,l,r,lef[MAXN][MAXN],rig[MAXN][MAXN],f[MAXN][MAXN];
int main(){
#ifdef WINE
freopen("data.in","r",stdin);
#endif
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%d",&k);
while(k--){
scanf("%d%d",&l,&r);
for(int j=l;j<=r;j++)
lef[i][j]=l,rig[i][j]=r;
}
}
for(int l=m;l>=1;l--)
for(int r=l;r<=m;r++){
for(int k=l;k<=r;k++){
int a=0;
for(int i=1;i<=n;i++)
if(lef[i][k]>=l&&rig[i][k]<=r)
a++;
f[l][r]=max(f[l][r],f[l][k-1]+a*a+f[k+1][r]);
}
}
printf("%d",f[1][m]);
return 0;
}
本文深入探讨了区间动态规划算法在解决特定类型问题上的应用。通过枚举中间列并最大化该列放置元素的数量,实现了对复杂状态的有效管理和最优解的求解。文章提供了详细的代码实现,帮助读者理解区间DP的核心思想及其在实际问题中的运用。

304

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



