记录编号 575582 评测结果 AAAAAAAAAA
题目名称 [NOI 1997]积木游戏 最终得分 100
用户昵称 Gravatar该账号已注销 是否通过 通过
代码语言 C++ 运行时间 0.044 s
提交时间 2022-09-21 21:25:47 内存使用 1.17 MiB
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
struct zxc{
    int a,b,c;
}l[110];
int n,m;
int f[110][110][3]={0};
int ans=0;
bool ck(int k1,zxc x,int k2,zxc y){
    if(k1==1){
        if(k2==1){
            if(x.a<=y.a&&x.b<=y.b)
            return 0;
            if(x.a<=y.b&&x.b<=y.a)
            return 0;
        }
        if(k2==2){
            if(x.a<=y.a&&x.b<=y.c)
            return 0;
            if(x.a<=y.c&&x.b<=y.a)
            return 0;
        }
        if(k2==3){
            if(x.a<=y.b&&x.b<=y.c)
            return 0;
            if(x.a<=y.c&&x.b<=y.b)
            return 0;
        }
    }
    if(k1==2){
        if(k2==1){
            if(x.a<=y.a&&x.c<=y.b)
            return 0;
            if(x.a<=y.b&&x.c<=y.a)
            return 0;
        }
        if(k2==2){
            if(x.a<=y.a&&x.c<=y.c)
            return 0;
            if(x.a<=y.c&&x.c<=y.a)
            return 0;
        }
        if(k2==3){
            if(x.a<=y.b&&x.c<=y.c)
            return 0;
            if(x.a<=y.c&&x.c<=y.b)
            return 0;
        }
    }
    if(k1==3){
        if(k2==1){
            if(x.b<=y.a&&x.c<=y.b)
            return 0;
            if(x.b<=y.b&&x.c<=y.a)
            return 0;
        }
        if(k2==2){
            if(x.b<=y.a&&x.c<=y.c)
            return 0;
            if(x.b<=y.c&&x.c<=y.a)
            return 0;
        }
        if(k2==3){
            if(x.b<=y.b&&x.c<=y.c)
            return 0;
            if(x.b<=y.c&&x.c<=y.b)
            return 0;
        }
    }
    return 1;
}
int main(){
    freopen("buildinggame.in","r",stdin);
    freopen("buildinggame.out","w",stdout);
    cin>>n>>m;
    for(int i=1;i<=n;i++)cin>>l[i].a>>l[i].b>>l[i].c;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=min(i,m);j++){
            for(int q=j-1;q<i;q++){
                for(int k1=1;k1<=3;k1++){
                    for(int k2=1;k2<=3;k2++){
                    int u;
                    if(k1==1)u=l[i].c;
                    if(k1==2)u=l[i].b;
                    if(k1==3)u=l[i].a;
                    f[j][i][k1]=max(f[j][i][k1],f[j-1][q][k2]+u);
                    if(ck(k1,l[i],k2,l[q])==0){
                        f[j][i][k1]=max(f[j][i][k1],f[j][q][k2]+u);
                    }}
                }
            }
        }
    }
    for(int i=m;i<=n;i++){
        for(int k=1;k<=3;k++)
        ans=max(ans,f[m][i][k]);
    }
    cout<<ans<<endl;
    return 0;
}