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 - The Tower of Babylon LIS

The Tower of Babylon  Perhaps you have heard of the legend of the Tower of Babylon. Now...

例题9-2 UVA - 437 The Tower of Babylon 巴比伦塔(DGA-DP)(已更新)

大体题意: 给你n种立方体,每种都无限个,要求选择一些立方体使得高度最大,并且满足越靠上的立方体长宽严格小于下面的!每个立方体可以旋转! 输出最大高度! 思路: 可以把立方体的属性存到Node结构体里...

uva-437 矩阵嵌套dp

旧题新做,以前都是照着背包九讲上的模板来的,现在照着紫书上的有向无环图DAG来,把每一个节点当成一个点,可以嵌套表明两个点连通,d(i)表明在节点i结束的最长路长度。不过解题重点还是把一个长方体看成三...

动态规划 DAG问题uva 437 The Tower of Babylon

The Tower of Babylon Perhaps you have heard of the legend of the Tower of Babylon. Nowadays many de...

uva 437 DAG上的动态规划

Perhaps you have heard of the legend of the Tower of Babylon. Nowadays many details of this talehave...

uva 437 The Tower of Babylon(动态规划 嵌套矩形问题最长路)

有思路就去做,要相信自己 多处理更复杂的情况,你就不觉得现在复杂了 #include #include #include using namespace std; typedef long lon...

UVA437 The Tower of Babylon

DAG(有向无环图)上的DP.每个砖块的三种放置方式可以当做3个点.dp[i]表示以i为最上面一块转的最高高度.那么dp[i]=max(dp[i],dp[j]+h[i]).其中∈E. 对砖块按长宽排...

poj 2241 && uva 437 The Tower of Babylon(DP)

题目地址:点击打开链接 思路: 每个砖块可以有三种放置方式,且每种方式至多只会用到一次,所以读入时把每块砖变成 3个不同的就行(长要大于宽),然后对长度进行排序。这样就变成了一个LIS问...

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

The Tower of Babylon  Perhaps you have heard of the legend of the Tower of Babylon. Nowad...

UVA 437 The Tower of Babylon

Perhaps you have heard of the legend of the Tower of Babylon. Nowadays many details of this tale hav...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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