码迷,mamicode.com
首页 > 其他好文 > 详细

ZOJ 1093

时间:2014-07-24 21:55:12      阅读:181      评论:0      收藏:0      [点我收藏+]

标签:os   io   for   re   c   amp   ios   不同的   

排序DP(相当于最长不下降子序列) 

如果把一块砖块的所有6种摆放方式转化为6种不同的砖块; 

即相当于有6n种砖块,然后按照一个方向从大到小排序; 

再依次检查每一块与其下面的所有砖块是否满足摆放条件; 

将每一块砖块放到塔中能够获得的最大高度记录到数组height[N]中; 

则该数组中的最大值就是该题的解了;

 

#include <iostream>
#include <algorithm>
#include "cstdio"
using namespace std;
#define maxi 200
struct Block{
    int x,y,h;
    void init(int xx,int yy,int hh){
        x=xx;
        y=yy;
        h=hh;
    }
}b[maxi];
int dp[maxi];
int cmp(Block a,Block c)
{
    return a.x>c.x;
}
int max(int a,int c){
    return a>c?a:c;
}
int main(){
    int n,x,y,h,m,game=0;
    freopen("test.txt","r",stdin);
    while(cin>>n){
        if(n==0)break;
        m=0;
        for(int i=0;i<n;i++){
            cin>>x>>y>>h;
            b[m++].init(x,y,h);
            b[m++].init(h,x,y);
            b[m++].init(y,h,x);
            b[m++].init(y,x,h);
            b[m++].init(x,h,y);
            b[m++].init(h,y,x);
        }
        sort(b,b+6*n,cmp);
        for(int i=0;i<n*6;i++){
            dp[i]=b[i].h;
        }
        int ma=0;
        for(int i=1;i<n*6;i++){
            int ans=0;
            for(int j=i-1;j>=0;j--){
                if(b[i].x<b[j].x&&b[i].y<b[j].y&&ans<dp[j])
                    ans=dp[j];
            }
            dp[i]+=ans;
            if(ma<dp[i])ma=dp[i];
        }
        cout<<"Case "<<++game<<": maximum height = "<<ma<<"\n";
    }
    return 0;
}

ZOJ 1093,布布扣,bubuko.com

ZOJ 1093

标签:os   io   for   re   c   amp   ios   不同的   

原文地址:http://www.cnblogs.com/Mr-Xu-JH/p/3865872.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!