`
king_tt
  • 浏览: 2229946 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

UVa 103 - Stacking Boxes

 
阅读更多

【题目链接】

http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=114&page=show_problem&problem=39


【原题】

Stacking Boxes

Background

Some concepts in Mathematics and Computer Science are simple in one or two dimensions but become more complex when extended to arbitrary dimensions. Consider solving differential equations in several dimensions and analyzing the topology of ann-dimensional hypercube. The former is much more complicated than its one dimensional relative while the latter bears a remarkable resemblance to its ``lower-class'' cousin.

The Problem

Consider ann-dimensional ``box'' given by its dimensions. In two dimensions the box (2,3) might represent a box with length 2 units and width 3 units. In three dimensions the box (4,8,9) can represent a boxtex2html_wrap_inline40(length, width, and height). In 6 dimensions it is, perhaps, unclear what the box (4,5,6,7,8,9) represents; but we can analyze properties of the box such as the sum of its dimensions.

In this problem you will analyze a property of a group ofn-dimensional boxes. You are to determine the longestnesting stringof boxes, that is a sequence of boxestex2html_wrap_inline44such that each boxtex2html_wrap_inline46nests in boxtex2html_wrap_inline48(tex2html_wrap_inline50.

A box D = (tex2html_wrap_inline52) nests in a box E = (tex2html_wrap_inline54) if there is some rearrangement of thetex2html_wrap_inline56such that when rearranged each dimension is less than the corresponding dimension in box E. This loosely corresponds to turning box D to see if it will fit in box E. However, since any rearrangement suffices, box D can be contorted, not just turned (see examples below).

For example, the box D = (2,6) nests in the box E = (7,3) since D can be rearranged as (6,2) so that each dimension is less than the corresponding dimension in E. The box D = (9,5,7,3) does NOT nest in the box E = (2,10,6,8) since no rearrangement of D results in a box that satisfies the nesting property, but F = (9,5,7,1) does nest in box E since F can be rearranged as (1,9,5,7) which nests in E.

Formally, we define nesting as follows: box D = (tex2html_wrap_inline52)nestsin box E = (tex2html_wrap_inline54) if there is a permutationtex2html_wrap_inline62oftex2html_wrap_inline64such that (tex2html_wrap_inline66) ``fits'' in (tex2html_wrap_inline54) i.e., iftex2html_wrap_inline70for alltex2html_wrap_inline72.

The Input

The input consists of a series of box sequences. Each box sequence begins with a line consisting of the the number of boxeskin the sequence followed by the dimensionality of the boxes,n(on the same line.)

This line is followed byklines, one line per box with thenmeasurements of each box on one line separated by one or more spaces. Thetex2html_wrap_inline82line in the sequence (tex2html_wrap_inline84) gives the measurements for thetex2html_wrap_inline82box.

There may be several box sequences in the input file. Your program should process all of them and determine, for each sequence, which of thekboxes determine the longest nesting string and the length of that nesting string (the number of boxes in the string).

In this problem the maximum dimensionality is 10 and the minimum dimensionality is 1. The maximum number of boxes in a sequence is 30.

The Output

For each box sequence in the input file, output the length of the longest nesting string on one line followed on the next line by a list of the boxes that comprise this string in order. The ``smallest'' or ``innermost'' box of the nesting string should be listed first, the next box (if there is one) should be listed second, etc.

The boxes should be numbered according to the order in which they appeared in the input file (first box is box 1, etc.).

If there is more than one longest nesting string then any one of them can be output.

Sample Input

5 2
3 7
8 10
5 2
9 11
21 18
8 6
5 2 20 1 30 10
23 15 7 9 11 3
40 50 34 24 14 4
9 10 11 12 13 14
31 4 18 8 27 17
44 32 13 19 41 19
1 2 3 4 5 6
80 37 47 18 21 9

Sample Output

5
3 1 2 4 5
4
7 2 5 6

【题目大意】

给n维图形,它们的边长是{d1,d2,d3...dn}, 对于两个n维图形,如果满足其中一个的所有边长按照任意顺序都一一对应小于另一个的边长,那么就锁可以嵌套到另一个。 例如a{1,2}, b{2,3}, a所有边长都已一一对应小于b的边长,所以a能嵌套于b。

给k个n维图形,求它们最多可以连续嵌套多少个。


【分析与总结】

首先要判断两个图形是否可以嵌套,只需要把所有图形边长都按照从小到达排好序,那么对于a,b两个,只要按顺序一一比较它们的边数,如果满足所有ai<bi,就所以a能嵌套于b。

然后,就是解法,这题有两种解法。


第一种就是所谓的用记忆化搜索求DAG模型(详见《算法入门经典》p161).

我们可以用图的邻接矩阵来表示所有的关系,a“可嵌套于”b,那么就是G[a][b]=1。然后这个问题就可以转化成求这张图的一个最长路径长度是多少。


第二种方法,假设a可嵌套于b用a<b来表示,那么最长的一串就是a<b<c<d<e..., 可以看出非常像是一个“最长递增子序列”, 这里的“递增”是指“维度”递增。



【代码】

方法一:记忆化搜索DAG模型

/*
 * UVa: 103 - Stacking Boxes
 * 记忆化搜索
 * Time: 0.016s
 * Author: D_Double
 *
 */
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
int G[32][32], arr[32][12], d[32], n, k;
bool first;

//判断arr[a]是否比arr[b]大
inline bool isBigger(int a, int b){
    for(int i=0; i<k; ++i)
        if(arr[a][i]<=arr[b][i])return false;
    return true;
}

int dp(int i){
    if(d[i]!=-1)return d[i];
    int &ans=d[i]=1;
    for(int j=0; j<n; ++j)if(G[i][j]){
        ans = max(ans, dp(j)+1);
    }
    return ans;
}

void Print(int i){
    if(first) printf(" %d",i+1);
    else {printf("%d",i+1); first=true;}
  //  printf("%d ", i+1);
    for(int j=0; j<n; ++j)if(G[i][j]&&d[j]+1==d[i]){
        Print(j);
        break;
    }
}

int main(){
    while(~scanf("%d%d",&n,&k)){
        for(int i=0; i<n; ++i){
            for(int j=0; j<k; ++j)
                scanf("%d",&arr[i][j]);
            sort(arr[i], arr[i]+k);
        }
        memset(G, 0, sizeof(G));
        for(int i=0; i<n-1; ++i){
            for(int j=i+1; j<n; ++j){
                if(isBigger(j,i))
                    G[i][j]=1;
                else if(isBigger(i,j))
                    G[j][i]=1;
            }
        }
        memset(d, -1, sizeof(d));
        int ans=-1, pos;
        for(int i=0; i<n; ++i){
            int t=dp(i);
            if(t>ans){
                ans=t;
                pos=i;
            }
        }
        printf("%d\n", ans);
        first=false;
        Print(pos);
        printf("\n");
    }
    return 0;
}


方法二:最长递增子序列

/*
 * UVa: 103 - Stacking Boxes
 * 最长递增子序列
 * Time: 0.056s
 * Author: D_Double
 *
 */
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
int G[32][32],  d[32], s[32],n, k;
bool first;

struct Node{
    int no;
    int A[12];
    int k;
    void Sort(){
        sort(A,A+k);
    }
    friend bool operator < (const Node&a, const Node&b){
        for(int i=0; i<a.k; ++i){
            if(a.A[i]>b.A[i])return false; 
        }
        return true;
    }
}arr[32];

//判断arr[a]是否比arr[b]大
inline bool isBigger(int a, int b){
    for(int i=0; i<k; ++i)
        if(arr[a].A[i]<=arr[b].A[i])return false;
    return true;
}

void print(int i){
    if(s[i]!=i)print(s[i]);
    printf("%d ", arr[i].no);
}

int main(){
    while(~scanf("%d%d",&n,&k)){
        
        for(int i=0; i<n; ++i){
            for(int j=0; j<k; ++j)
                scanf("%d",&arr[i].A[j]);
            arr[i].no=i+1;
            arr[i].k=k;
            arr[i].Sort();
        }
        sort(arr,arr+n);
        memset(G, 0, sizeof(G));
        for(int i=0; i<n-1; ++i){
            for(int j=i+1; j<n; ++j){
                if(isBigger(j,i))
                    G[i][j]=1;
            }
        }
        int maxVal=1,pos=0;
        s[0]=0; d[0]=1;
        for(int i=1; i<n; ++i){
            d[i]=1; s[i]=i;
            for(int j=0; j<i; ++j)if(G[j][i]&&d[i]<d[j]+1){
                s[i]=j;
                d[i]=d[j]+1;
            }
            if(d[i]>maxVal){
                pos=i;
                maxVal=d[i];
            }
        }
        printf("%d\n", maxVal); 
        print(pos);
        printf("\n");
    }
    return 0;
}




—— 生命的意义,在于赋予它意义。

原创http://blog.csdn.net/shuangde800By D_Double (转载请标明)


分享到:
评论

相关推荐

    56XX-PG707-RDS---Stacking Guide

    根据提供的文件信息,本文将对“56XX-PG707-RDS---Stacking Guide”进行详细解读,重点分析其标题与描述中所涉及的关键知识点,并结合标签和部分内容进行扩展。 ### 一、概述 #### 1.1 引言 本指南是针对Broadcom...

    1012-Stacking Cylinders

    1012-Stacking Cylinders

    cortex-m4f-lazy-stacking-and-context-switching.pdf

    Cortex-M4(F) Lazy Stacking 和 Context Switching 本文档主要介绍了 ARM Cortex-M4(F) 处理器的 Lazy Stacking 和 Context Switching 机制。Lazy Stacking 是一种优化的堆栈管理机制,用于减少 Context Switching ...

    simple-stacking-game-using-python

    在"Simple Stacking Game using Python"这个项目中,我们可以预期以下关键知识点: 1. **基本Python语法**:包括变量定义、数据类型(如整数、字符串、列表)、条件语句(if-else)、循环结构(for、while)等,...

    Concentration Dependant Self-Stacking of Nucleic Acids Molecules in Capillary Electrophoresis

    毛细管电泳是一种在电场作用下通过毛细管对带电分子进行分离的高效技术,广泛应用于DNA、RNA以及蛋白质等生物大分子的分析。在毛细管电泳中,核酸分子的在线堆积指的是在电泳分离过程中,由于电泳迁移率的变化导致的...

    box-stacking-game:使用HTML,CSS和JS制作的盒装游戏

    本项目"box-stacking-game"就是一个很好的实例,它展示了如何利用这些技术来创建一个有趣的盒装游戏。下面我们将详细探讨这三个关键元素在游戏中的应用。 首先,HTML(HyperText Markup Language)是网页内容的基础...

    find-stacking-contexts:一种识别给定 DOM 节点元素的父 z-index 堆叠上下文的算法

    标题中的 "find-stacking-contexts" 是一个 JavaScript 库,专门设计用来帮助开发者识别给定 DOM 节点的父级堆叠上下文。这个工具可以帮助开发者理解为什么某些元素的 `z-index` 设置没有按照预期工作,从而简化了...

    python-focus-stacking

    【Python焦点堆叠技术详解】 焦点堆叠,也称为焦点叠加或景深合成,是一种摄影后期处理技术,用于将多张具有不同焦距的照片合并成一张图像,从而获得更大的景深。在数字图像处理领域,Python语言凭借其丰富的库和...

    颜色分类leetcode-Stacking:多模型集成

    在IT行业中,颜色分类可能指的是将数据按照某种颜色标准进行归类的问题,这在图像处理、数据...这个开源项目“Stacking-master”可能提供了实现这一过程的代码框架和示例,对于理解和应用Stacking技术是很有帮助的。

    Reinforcement-Learning-Pulse-Stacking

    结合强化学习的力量和随机平行的梯度体面来优化脉冲叠加的延迟线在本文中,我们将动量合并到随机平行梯度下降(SPGD)中以创建称为SPGDM的算法。 通过将SPGDM与稳定的强化学习之一“软演员临界(SAC)”相结合,我们...

    WSClean:WSClean是一款快速的宽视场干涉成像仪-开源

    它使用w-stacking算法,并且可以利用w-snapshot算法。 截至2014年2月,根据阵列配置,它比CASA的w投影速度快2-12倍。 它支持全天候成像和针对同质偶极子阵列(例如MWA)的适当光束校正。 WSClean可以进行Hogbom和...

    matlab图像膨胀代码-astack:A-stacking代码库

    matlab 图像膨胀代码堆栈 这是基于 A 叠加的无线电干涉成像技术的演示。 演示 提供了三个演示脚本: 以及一个示例输入数据集,该数据集为瑞典 Onsala ...站的玩具模型提供阵列布局和辐射模式数据。...

    DS2_Ensemble-Stacking

    作业1-数据科学2 @ CEU 2020-2021由该包含在为DS2课程的首次作业分配最终HTML报告时使用的所有代码,数据文件和输出。建议将整个存储库以ZIP格式下载,或将其克隆到本地计算机上,并将其根文件夹设置为R Project。...

    sourcegraph-css-stacking-contexts:Sourcegraph扩展,突出显示引入新堆栈上下文CSS声明

    :zzz: CSS Stacking Context Sourcegraph扩展 z-index的问题在于,很少有人了解它的真正工作原理。 它并不复杂,但是如果您从未花时间阅读它的规范,那么几乎可以肯定有一些关键方面是您完全不知道的。 避免绊倒的...

    2021 武汉新芯代工业务介绍 中文版 v1.0.pdf

    XMC 3DLink™技术路线展示了公司从2012年开始在三维堆叠技术上的发展,包括BSI CIS、S-stacking®、S-stacking®(Hybrid Bonding)、M-stacking®等,直至最新的Hi-stackingTM,展现了公司在芯片到晶圆集成以及系统...

    DieStackingArchitecture_xie2015.pdf

    在当今IT领域,深度学习与高性能计算的发展为芯片架构带来了新的挑战与机遇。特别是随着数据量的增长和模型复杂性的提升,传统的二维芯片架构面临着严峻的性能瓶颈。3D堆叠架构,尤其是晶体管、芯片等三维集成电路...

Global site tag (gtag.js) - Google Analytics