CF 1372E - Omkar and Last Floor 区间DP
用 表示从 列到 列能够得到的最大值,枚举中间某列 ,使这一列尽可能多地放 (根据每个区间的左右来进行判断),然后就是个区间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;
}