九度OJ 1410 垒积木 -- 动态规划
题目地址:http://ac.jobdu.com/problem.php?pid=1410
- 题目描述:
-
给你一些长方体的积木,问按以下规则能最多垒几个积木。
1 一个积木上面最多只能垒另一个积木。
2 在下面的积木的长宽高要大于或等于上面的积木的长宽高
- 输入:
-
输入有多组,每组输入第一行是一个整数n(1<=n<=1000000),接下来n行的每行包括三个整数l,w,h(1 <= w,l,h <= 100),表示积木的长宽高。
- 输出:
-
对于每组输入,输出按规则最多能垒几个积木。
- 样例输入:
-
3
-
5 2 1
-
4 2 1
-
3 3 1
-
3
-
1 5 1
-
5 1 1
-
2 2 2
- 样例输出:
-
2
-
1
dp[i][j][k] = max{ dp[i-1][j][k], dp[i][j-1][k], dp[i][j][k-1] } +hash[i][j][k],其中hash[i][j][k]表示长为i、宽为j、高为k的积木的个数。
#include <stdio.h> #include <string.h> #define MAX 101 int Max (int a, int b, int c){ a = (a > b) ? a : b; a = (a > c) ? a : c; return a; } int main(void){ int n; int hash[MAX][MAX][MAX]; int dp[MAX][MAX][MAX]; int length; int width; int height; int i; int j; int k; int max; while (scanf ("%d", &n) != EOF){ memset (hash, 0, sizeof(hash)); memset (dp, 0, sizeof(dp)); for (i=0; i<n; ++i){ scanf ("%d%d%d", &length, &width, &height); ++hash[length][width][height]; } max = 0; for (i=1; i<MAX; ++i){ for (j=1; j<MAX; ++j){ for (k=1; k<MAX; ++k){ dp[i][j][k] = Max (dp[i-1][j][k], dp[i][j-1][k], dp[i][j][k-1]) + hash[i][j][k]; if (dp[i][j][k] > max) max = dp[i][j][k]; } } } printf ("%d\n", max); } return 0; }