zoukankan      html  css  js  c++  java
  • ZOJ 1093

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

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

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

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

    将每一块砖块放到塔中能够获得的最大高度记录到数组dp[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<<" ";
        }
        return 0;
    }

  • 相关阅读:
    Mycat 注解说明
    Mycat 读写分离详解
    Mycat 常用管理命令说明
    Mycat 分片规则详解--数据迁移及节点扩容
    Mycat 分片规则详解--一致性hash分片
    Mycat 分片规则详解--日期范围 hash 分片
    Mycat 分片规则详解--自然月分片
    Mycat 分片规则详解--单月小时分片
    Mycat 分片规则详解--日期(天)分片
    Mycat 分片规则详解--应用指定分片
  • 原文地址:https://www.cnblogs.com/Mr-Xu-JH/p/3865872.html
Copyright © 2011-2022 走看看