CF 1372E - Omkar and Last Floor 区间DP

在这里插入图片描述
f[i][j]f[i][j] 表示从 ii 列到 jj 列能够得到的最大值,枚举中间某列 kk,使这一列尽可能多地放 11(根据每个区间的左右来进行判断),然后就是个区间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;
}

posted @ 2020-07-12 15:49  winechord  阅读(84)  评论(0编辑  收藏  举报