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