uva:103 - Stacking Boxes

原创 2012年03月29日 09:23:00

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

嵌套矩阵,先建图,然后记忆化搜索求解。在建图之前,先将箱子的边进行排序,便于后面的建图。

动规方程:d[i] = max{ d[j] + 1 | G[i][j] = 1};

代码如下:

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

struct Node {
	int  num[15] ;

	void sort_box(int n){
		sort(num , num + n) ;
	}
} ;
Node box[35] ;

int G[35][35] ;
int d[35] ;

int n ;
int m ;
bool first ;

void build() ;
int dp(int ) ;
void work()  ;
void print(int ) ;

int main()
{
	//freopen("datain.txt" , "r" , stdin) ;

	int i ;
	int j ;

	while(scanf("%d %d" , &n , &m)!=EOF)
	{
		for(i = 0 ; i < n ; i ++)
		{
			for(j = 0 ; j < m ; j ++)
			{
				scanf("%d" , &box[i].num[j]) ;
			}
		}

		build() ;
		memset(d , 0 , sizeof(d)) ;

		for(i = 0 ; i < n ; i ++)
		{
			dp(i);
		}

		j = 0 ;
		for(i = 1 ; i < n ; i ++)
			if(d[i] > d[j])
			{
				j = i ;
			}

		first = false ;
		printf("%d\n" , d[j]) ;
		print(j) ;
		printf("\n")  ;
	}
	return 0 ;
}

void build()
{
	memset(G , 0 , sizeof(G)) ;

	int i ;
	int j ;
	int k ;

	for(i = 0 ; i < n ; i ++)
	{
		box[i].sort_box(m) ;
	}

	for(i = 0 ; i <  n ; i ++)
	{
		for(j = 0 ; j < n ; j ++)
		{
			for(k = 0 ; k < m ; k ++)
			{
				if(box[i].num[k] >= box[j].num[k])
					break ;
			}

			if(k==m)
				G[i][j] = 1 ;
		}
	}
}

int dp(int i)
{
	int &ans = d[i] ;

	if(ans > 0)
		return ans ;
	ans = 1 ;

	for(int j = 0 ; j < n ; j ++)
	{
		if(G[i][j] )
			ans = ans > dp(j) + 1 ? ans : dp(j) + 1 ;
	}

	return ans ;
}

void print(int s)
{
	if(first)
		printf(" ") ;

	printf("%d" , s + 1) ;

	first = true ;

	for(int j = 0 ; j < n ; j ++)
	{
		if(G[s][j] && d[s] == d[j] + 1)
		{
			print(j) ;
			break ;
		}
	}
}

 

相关文章推荐

UVA 103 Stacking Boxes 堆砌盒子(DP)

Stacking Boxes  Background Some concepts in Mathematics and Computer Science are simpl...

UVA - 103 Stacking Boxes

题目:  Stacking Boxes  Background Some concepts in Mathematics and ...

[UVA 103] Stacking Boxes

本题目实际上是求DAG上的最长路径。因为盒子之间的嵌套关系是二元关系。而二元关系可以用图模型来建模。例如,盒子a可以嵌套在盒子b中,那么在图模型中就是a和b之间有一条从a到b的有向边。注意到这个有向图...

UVa系列——103/Stacking Boxes

引用请注明出处:http://blog.csdn.net/int64ago/article/details/7463401 这题的做法有点贪心的思想在里面,最后的处理也可以算是DP吧。根据贪心的...

uva--103Stacking Boxes +dp

题意:     其实就是把矩形嵌套扩大到了n维,但是规定这个n维的几何体是可以任意扭曲的。 思路:    就是按照矩形嵌套问题的思路,不过判定是否可以嵌套的时候,我们直接都排一下序就判断了(因为...
  • acm_lkl
  • acm_lkl
  • 2014年12月01日 23:40
  • 701

UVA - 103 Stacking Boxes(DAG最长路)

题目大意:k 个 n 维图形,给出边长。对于 A、B 两个图形,若能找到任意一个顺序使得 A 的每条边都小于 B,则 A 可以嵌套在 B 里。问最多能嵌套几个,并输出嵌套顺序。 解题思路:边长排序一...

uva 103 Stacking Boxes 动态规划

// // main.cpp // Calmeii // // Created by Calmeii on 14-5-5. // Copyright (c) 2014年 apple. All ...
  • Calmei
  • Calmei
  • 2014年05月05日 17:01
  • 352

uva 103 - Stacking Boxes

//可以使用佳哥介绍的DAG动规,不过麻烦些//建议使用LIS ,那么排序函数Cmp()成了以问题关键, 可以把每个box的值从左到右作为比较的关键字, 这样人为的赋予一个优先级.由于这些集合相互之间...

uva 103 Stacking Boxes

题目大意:多维方形嵌套问题,要求输出最大的个数以及任意一组可嵌套的方形 题目思路:参考两维的矩形嵌套问题 题目坑点:无 参考代码: #include #include #include...

UVa 103 - Stacking Boxes

/*UVa 103 - Stacking Boxes * */ import java.util.Arrays; import java.util.Scanner; class Main { p...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:uva:103 - Stacking Boxes
举报原因:
原因补充:

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