比赛 |
EYOI与SBOI开学欢乐赛5th |
评测结果 |
AAWAAWAAWA |
题目名称 |
积木游戏 |
最终得分 |
70 |
用户昵称 |
yrtiop |
运行时间 |
0.022 s |
代码语言 |
C++ |
内存使用 |
1.16 MiB |
提交时间 |
2022-09-16 21:39:03 |
显示代码纯文本
#include <bits/stdc++.h>
const int maxn = 105;
const int INF = 0x3f3f3f3f;
int n,m,f[maxn][maxn],F[maxn][3][3],dp[maxn][maxn],a[maxn][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][0],&a[i][1],&a[i][2]);
std::sort(a[i] , a[i] + 3);
}
for(int i = 1;i <= n;++ i) {
for(int j = 0;j < 2;++ j)
for(int k = j + 1;k < 3;++ k)
F[i][j][k] = -INF;
F[i][0][1] = a[i][2];
F[i][0][2] = a[i][1];
F[i][1][2] = a[i][0];
dp[i][i] = std::max(dp[i][i] , std::max(a[i][0] , std::max(a[i][1] , a[i][2])));
for(int j = i + 1;j <= n;++ j) {
dp[i][j] = -INF;
for(int k = 0;k < 2;++ k) {
for(int q = k + 1;q < 3;++ q) {
F[j][k][q] = -INF;
for(int p = j - 1;p >= i;-- p) {
for(int e = 0;e < 2;++ e) {
for(int w = e + 1;w < 3;++ w) {
if(F[p][e][w] == -INF)continue ;
if(a[j][k] <= a[p][e]&&a[j][q] <= a[p][w]) {
F[j][k][q] = std::max(F[j][k][q] , F[p][e][w] + a[j][3 - q - k]);
}
}
}
}
dp[i][j] = std::max(dp[i][j] , F[j][k][q]);
}
}
}
}
memset(f , -0x3f , sizeof(f));
f[0][0] = 0;
for(int i = 1;i <= n;++ i) {
int t = std::min(i , m);
for(int j = 1;j <= t;++ j) {
for(int k = i - 1;k >= j - 1;-- k) {
f[i][j] = std::max(f[i][j] , f[k][j - 1] + dp[k + 1][i]);
}
}
}
printf("%d",f[n][m]);
return 0;
}