现在的位置: 首页 > 综合 > 正文

poj 2241 The Tower of Babylon(DP…

2018年03月17日 ⁄ 综合 ⁄ 共 1097字 ⁄ 字号 评论关闭
题意:有N种不同尺过的block(矩形) 每一种数量无限,可以任意旋转 也就是说 x y z 其中可任意两个为底,另一个为高。问你
最多能堆多高,要求上面的block要严格的小于下面block的底 即xj < xi
&& yj < yi

思路:动态规划 虽说每种block数量无限,但其实最多只能用三块。对全部的block 排序 x 降序 x相同 y 降序。
这样就能转换成最大非增递子序列。

//172K   
0MS
#include <stdio.h>
#include <algorithm>
#define M 100
using namespace std;

struct data
{
    int
x,y,h;
}node[M];
int num[3];
void
_sort()     
//让num从大到小排
{
    for (int j =
1;j < 3;j ++)
       
for (int i = 0;i < 3-j;i ++)
           
if (num[i] < num[i+1])
           
{
               
int tem = num[i];
               
num[i] = num[i+1];
               
num[i+1] = tem;
           
}
}
bool cmp (data a,data b)
{
    if (a.x
> b.x)
       
return true;
    if (a.x ==
b.x&&a.y >
b.y)
       
return true;
    return
false;
}
int main ()
{
    int
n,i,k,max,count = 0,tall[M];
    while (scanf
("%d",&n)&&n)
    {
       
k = 0;
       
for (i = 0;i < n;i ++)
       
{
           
scanf
("%d%d%d",&num[0],&num[1],&num[2]);

           
_sort ();
           
node[k].x = num[0],node[k].y = num[1],node[k++].h = num[2];
           
node[k].x = num[0],node[k].y = num[2],node[k++].h = num[1];
           
node[k].x = num[1],node[k].y = num[2],node[k++].h = num[0];
       
}
       
sort (node,node + k,cmp);
       
for (i = 0;i < k;i
++)   
//dp求最大非递增子序列
       
{
           

抱歉!评论已关闭.