比赛 |
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;
}