-
题目描述:
-
给你一些长方体的积木,问按以下规则能最多垒几个积木。
1 一个积木上面最多只能垒另一个积木。
2 在下面的积木的长宽高要大于或等于上面的积木的长宽高
-
输入:
-
输入有多组,每组输入第一行是一个整数n(1<=n<=1000000),接下来n行的每行包括三个整数l,w,h(1 <= w,l,h <= 100),表示积木的长宽高。
-
输出:
-
对于每组输入,输出按规则最多能垒几个积木。
-
样例输入:
-
35 2 14 2 13 3 131 5 15 1 12 2 2
-
样例输出:
-
2
-
1
-
-
-
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
-
代码如下
-
#include<stdio.h>//其实就是在三维的矩阵中找一条加权最长路径 #include<string.h> using namespace std; int n; int dp[101][101][101];//dp用来记住小于等于当前长宽高的最长最长路径,对于固定的点来说,到达它的最长路径在最接近它的三个点中选出 int xp[101][101][101]; int max(int a, int b, int c)//在最接近它的三个点中选出最长路径 { a = a > b ? a : b; return a > c ? a : c; } int main() { while (scanf("%d", &n) != EOF) { if (n < 1) return 0; int a, b, c; memset(xp, 0, sizeof(xp)); memset(dp, 0, sizeof(dp)); for (int i = 0; i < n; i++)//将每个点所代表的矩形个数求出; { scanf("%d%d%d", &a, &b, &c); xp[a][b][c]++; } int mx = 0; for (int i = 1; i <=100; i++) for (int i1 = 1; i1 <= 100; i1++) for (int i2 = 1; i2 <= 100; i2++) { dp[i][i1][i2] = max(dp[i - 1][i1][i2], dp[i][i1 - 1][i2], dp[i][i1][i2 - 1]) + xp[i][i1][i2]; if (mx < dp[i][i1][i2]) mx = dp[i][i1][i2]; } printf("%d\n", mx); } return 0; } /************************************************************** Problem: 1410 User: 午夜小白龙 Language: C++ Result: Accepted Time:1100 ms Memory:9068 kb ****************************************************************/