- 題目描述:
-
給你一些長方體的積木,問按以下規則能最多壘幾個積木。
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 ****************************************************************/