比赛 EYOI与SBOI开学欢乐赛5th 评测结果 AAAAAAAAAA
题目名称 积木游戏 最终得分 100
用户昵称 op_组撒头屯 运行时间 0.055 s
代码语言 C++ 内存使用 1.18 MiB
提交时间 2022-09-16 21:29:57
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
const int N=100+5;
int n,m;
int a[N],b[N],c[N];
int f[N][N][4];
bool check1(int x,int opt,int y){
    int p,q,r=a[y],s=b[y];
    if (opt==1)p=a[x],q=b[x];
    if (opt==2)p=b[x],q=c[x];
    if (opt==3)p=a[x],q=c[x];
    if (r<=p&&s<=q)return 1;
    if (s<=p&&r<=q)return 1;
    return 0;
}
bool check2(int x,int opt,int y){
    int p,q,r=b[y],s=c[y];
    if (opt==1)p=a[x],q=b[x];
    if (opt==2)p=b[x],q=c[x];
    if (opt==3)p=a[x],q=c[x];
    if (r<=p&&s<=q)return 1;
    if (s<=p&&r<=q)return 1;
    return 0;
}
bool check3(int x,int opt,int y){
    int p,q,r=a[y],s=c[y];
    if (opt==1)p=a[x],q=b[x];
    if (opt==2)p=b[x],q=c[x];
    if (opt==3)p=a[x],q=c[x];
    if (r<=p&&s<=q)return 1;
    if (s<=p&&r<=q)return 1;
    return 0;
}
int mxx(int x,int y){
    return max(f[x][y][1],max(f[x][y][2],f[x][y][3]));
}
int main(){
    freopen ("buildinggame.in","r",stdin);
    freopen ("buildinggame.out","w",stdout);
    scanf("%d%d",&n,&m);
    for (int i=1;i<=n;i++){
        scanf("%d%d%d",&a[i],&b[i],&c[i]);
    }
    for (int i=1;i<=n;i++){
        for (int j=1;j<=m;j++){
            for (int k=j-1;k<i;k++){
                f[j][i][1]=max(f[j][i][1],mxx(j-1,k)+c[i]);
                f[j][i][2]=max(f[j][i][2],mxx(j-1,k)+a[i]);
                f[j][i][3]=max(f[j][i][3],mxx(j-1,k)+b[i]);
            } 
            for (int k=j;k<i;k++){
                for (int p=1;p<=3;p++){
                    if (check1(k,p,i)){
                        f[j][i][1]=max(f[j][i][1],f[j][k][p]+c[i]);
                    }
                    if (check2(k,p,i)){
                        f[j][i][2]=max(f[j][i][2],f[j][k][p]+a[i]);
                    }
                    if (check3(k,p,i)){
                        f[j][i][3]=max(f[j][i][3],f[j][k][p]+b[i]);
                    }
                }
            }
        }
    }
    int ans=0;
    for (int i=m;i<=n;i++)ans=max(ans,mxx(m,i));
    printf("%d\n",ans);
    return 0;
}