uva 437 The Tower of Babylon

题意:用砖块建塔,直线向上叠,地下砖块要长宽都比上面砖块大,严格递减

dp一下即可

博主有两种做法

结构体做法

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

struct Cube
{
    int l,w,h;
    Cube(int ll = 0,int ww = 0,int hh = 0)
    {
        l = ll;
        w = ww;
        h = hh;
    }
    friend bool operator < (const Cube &c1,const Cube &c2)
    {
        if(c1.l != c2.l)
            return c1.l > c2.l;
        return c1.w > c2.w;
    }


};

vector<Cube> cube;
int main()
{
    int n;
    int cas = 0;

    while(scanf("%d",&n) && n)
    {
        //num.clear();//clear()容量大小也会消失的
        cube.clear();
        for(int i = 0; i < n; i++)
        {
            vector<int> num(3);  //注意在这里设置num大小
            scanf("%d %d %d",&num[0],&num[1],&num[2]);
            sort(num.begin(),num.end());
            do
            {
                cube.push_back(Cube(num[0],num[1],num[2]));
            }while(next_permutation(num.begin(),num.end()));
        }
        sort(cube.begin(),cube.end());
        vector<int> dp(cube.size());
        int height = cube[0].h;
        dp[0] = cube[0].h;
        for(int i = 1; i < cube.size(); i++)
        {
           // printf("cube l = %d  w = %d  h = %d \n",cube[i].l,cube[i].w,cube[i].h);
            dp[i] = cube[i].h;
             height = max(height,dp[i]);
            for(int j = i -1; j > 0; j--)
            {
                if(cube[i].l < cube[j].l && cube[i].w < cube[j].w)
                    dp[i] = max(dp[i],dp[j] + cube[i].h);
            }
            height = max(height,dp[i]);

        }
        printf("Case %d: maximum height = %d\n",++cas,height);
    }
    return 0;
}

类做法

#include<iostream>
#include<sstream>
#include<string>
#include<vector>
#include<list>
#include<set>
#include<map>
#include<stack>
#include<queue>
#include<algorithm>
#pragma warning(disable:4996)
#include<cstdio>
#include<cstdlib>
using namespace std;
class Cube
{
public:
	int length, width, height;
	Cube()
	{
		length = width = height = 0;
	}
	Cube(const int &l,const int &w,const int &h)
	{
		length = l, width=w, height = h;
	}
	friend bool operator<(const Cube &c1,const Cube &c2)
	{
		if (c1.length != c2.length)
		{
			return c1.length>c2.length;
		}
		return c1.width > c2.width;
	}
};
int main()
{
	//freopen("input.txt", "r", stdin);
	//freopen("output.txt", "w", stdout);
	int n,count=0;
	while (cin >> n&&n)
	{
		vector<Cube>cube;
		for (int i = 0; i < n; i++)
		{
			vector<int>dimension(3);
			cin >> dimension[0] >> dimension[1] >> dimension[2];
			std::sort(dimension.begin(), dimension.end());
			do
			{
				cube.push_back({ dimension[0],dimension[1],dimension[2] });
			} while (std::next_permutation(dimension.begin(), dimension.end()));
		}
		vector<int>dp(cube.size());
		std::sort(cube.begin(), cube.end());
		dp[0] = cube[0].height;
		int height = dp[0];
		for (int i = 1; i < dp.size(); i++)
		{
			dp[i] = cube[i].height;
			height = std::max(height, cube[i].height);
			for (int j = i - 1; j >= 0; j--)
			{
				if (cube[i].length < cube[j].length&&cube[i].width < cube[j].width)
				{
					dp[i] = std::max(dp[i], dp[j] + cube[i].height);
				}
			}
			height = std::max(height, dp[i]);
		}
		cout << "Case "<<++count<<": maximum height = "<<height << endl;
	}
	return 0;
}


你可能感兴趣的:(uva 437 The Tower of Babylon)