P5760
容易想到设
然后考虑第
-
不放,什么都不用做
-
另起一个柱子,枚举第
堆柱子的顶端 ,则 -
加在前一个柱子之前,枚举第
块积木在第 块积木上,则
其中,
高高兴兴地写完,交!听取 WA 声一片啊!
仔细想想:长方体可以通过旋转得到另一个长方体!
一个长方体可以最多可以
令类型
类型
类型
其中,
设
这里
同上,分三种情况:
-
不放,什么都不用做
-
另起一个柱子,枚举第
堆柱子的顶端 ,则 -
加在前一个柱子之前,枚举第
块积木在第 块积木上,则
其中,
以下优化为 @asdfo123 大佬的方法:
为了方便,令
在令
则类型为
这样在
#include <cstdio>
#include <iostream>
using namespace std;
const int N = 110;
int l[N][5], f[N][N][5];
int length (int x, int d) { // 计算第 x 个长方体 d 类型的长方体的长
return max (l[x][d], l[x][d + 1]);
}
int width (int x, int d) { // 计算第 x 个长方体 d 类型的长方体的宽
return min (l[x][d], l[x][d + 1]);
}
bool check (int x, int d1, int y, int d2) { // 判断上下放置是否合法
return (length (x, d1) <= length (y, d2)) && (width (x, d1) <= width (y, d2));
}
int main() {
int n, m; scanf ("%d%d", &n, &m);
for (int i = 1; i <= n; ++i) {
scanf ("%d%d%d", &l[i][0], &l[i][1], &l[i][2]);
l[i][3] = l[i][0]; l[i][4] = l[i][1];
}
int ans = 0;
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= m; ++j) {
for (int k = 0; k < i; ++k) {
for (int d1 = 0; d1 <= 2; ++d1) {
for (int d2 = 0; d2 <= 2; ++d2) {
f[i][j][d1] = max (f[i][j][d1], f[k][j - 1][d2] + l[i][d1 + 2]); // 另起一堆柱子
if (check (i, d1, k, d2)) {
f[i][j][d1] = max (f[i][j][d1], f[k][j][d2] + l[i][d1 + 2]); // 放在在以前的柱子上面
}
ans = max (ans, f[i][j][d1]);
}
}
}
}
}
printf ("%d", ans);
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现