UVA 437. 叠罗汉

原创 2013年12月02日 16:53:23

一堆正方体格子,每种格子有无限个,最高能叠多高。每一层的下面那个都必须严格大于上面那个(长和宽)

dp[i][j][k] 若有n个格子的话最多转移3*n次,懒得搞了...每一个都转移99次,反正n对多为30,。

dp[i][j][k]表示这是第i次转移,最上面那个是j,j的k面朝上。

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;

int cube[100][3];
int n;
int dp[100][100][3];
int a[3][2]={0,1,0,2,1,2};
int h[3]={2,1,0};
int area(int n,int k)
{
    return cube[n][a[k][0]]*cube[n][a[k][1]];
}
int height(int n,int k)
{
    return cube[n][h[k]];
}
int main()
{
    int cur;
    int next;
    int T=0;
    while(scanf("%d",&n)&&n!=0)
    {
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<3;j++)
                scanf("%d",&cube[i][j]);
        }
        memset(dp,0,sizeof(dp));
        cur=0;
        next=1;
        for(int i=0;i<n;i++)
            for(int j=0;j<3;j++)
                dp[cur][i][j]=height(i,j);
        int flag=true;
        for(int ii=0;ii<100;ii++)
        {
            flag=false;
            for(int i=0;i<n;i++)
            {
                for(int j=0;j<3;j++)
                {
                    for(int k=0;k<n;k++)
                    {
                        for(int l=0;l<3;l++)
                        {
                            int minb=min(cube[i][a[j][0]],cube[i][a[j][1]]);
                            int maxb=max(cube[i][a[j][0]],cube[i][a[j][1]]);
                            int minu=min(cube[k][a[l][0]],cube[k][a[l][1]]);
                            int maxu=max(cube[k][a[l][0]],cube[k][a[l][1]]);
                            if(minb>minu&&maxb>maxu)
                            {
                                dp[next][k][l]=max(dp[next][k][l],dp[cur][i][j]+height(k,l));
                                flag=true;
                            }
                            else
                            {
                                dp[next][i][j]=max(dp[next][i][j],dp[cur][i][j]);
                            }
                        }
                    }
                }
            }
            cur++;
            next++;
        }
        int max_=-1;
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<3;j++)
            {
                if(max_<dp[99][i][j])
                    max_=dp[99][i][j];
            }
        }
        printf("Case %d: maximum height = %d\n",++T,max_);
    }
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

UVA 437 DAG最长路

#include #include #include #include using namespace std; #define MAX 105 int n; int block[MAX][3]; ...

UVa 437 - The Tower of Babylon(DAG动态规划)

给出一些长方体,求能叠成的最高的顶面长和宽严格递减的塔有多高。 几乎和嵌套矩形的一样,储存每个长方体的面,然后dp搜索。...
  • wcr1996
  • wcr1996
  • 2015年03月09日 17:52
  • 1165

UVa 437 - The Tower of Babylon

本质上是最长上升序列,d[i]为前i个block所取得的最大高度,转移方程为 d[i] = max(d[i],d[j]+height[i]),( j reference to http://bel...
  • kokosy
  • kokosy
  • 2012年09月22日 09:43
  • 460

uva--437The Tower of Babylon+dp

题意:       给定一些立方体,对于两个立方体,只有其中一个底面两个边都严格小于另一个才可以放在其上面。求可以得到的最大高度。 思路:     一个立方体可以转成6个底面不同的具有不同权...
  • acm_lkl
  • acm_lkl
  • 2014年12月31日 13:33
  • 454

UVa 437 The Tower of Babylon(DP 最长条件子序列)

 题意  给你n种长方体  每种都有无穷个  当一个长方体的长和宽都小于另一个时  这个长方体可以放在另一个上面  要求输出这样累积起来的最大高度 因为每个长方体都有3种放法  比较不好控制 ...
  • acvay
  • acvay
  • 2014年08月23日 10:50
  • 775

UVA 437 The Tower of Babylon | dp

题意: 给你无限个

UVA 437 The Tower of Babylon - 简单dp

题目描述](http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=19214)分析:因为每种都有无穷多个,所以可以将每个立方体拆成三个...

uva 437 The Tower of Babylon (DAG)

uva 437 The Tower of BabylonPerhaps you have heard of the legend of the Tower of Babylon. Nowadays m...

UVa 437 巴比伦塔(The Tower of Babylon)详细题解

题目传送门:https://vjudge.net/problem/UVA-437题目:Perhaps you have heard of the legend of the Tower of Baby...
  • NOIAu
  • NOIAu
  • 2017年05月10日 18:59
  • 207

UVA 437_The Tower of Babylon

题意:一堆石头,给定长宽高,每种石头均可以使用无数次,问这堆石头可以叠放的最高高度,要求下面的石头的长和宽分别严格大于上面石头的长和宽。分析:采用DAG最长路算法,由于长宽较大,不能直接用于表示状态,...
  • Yukizzz
  • Yukizzz
  • 2016年01月27日 17:15
  • 314
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:UVA 437. 叠罗汉
举报原因:
原因补充:

(最多只允许输入30个字)