九度 題目1410:壘積木

題目描述:

給你一些長方體的積木,問按以下規則能最多壘幾個積木。

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
****************************************************************/


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章