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

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

uva 103 - Stacking Boxes

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

UVA 103 (Stacking Boxes)

【题目】 Description Background Some concepts in Mathematics and Computer Science are simple in one...
  • just_sort
  • just_sort
  • 2016年03月29日 10:31
  • 313

Uva - 103 - Stacking Boxes

题意:有k个n维的东东,对于其中的两个,如果其中的一个东东的每一维都大于另一个东东的其中一维,那么就说可以嵌套它,求这k个东东互相嵌套的最长路径。 题目链接:http://uva.onlinejud...
  • SCNU_Jiechao
  • SCNU_Jiechao
  • 2013年04月04日 00:12
  • 1643

UVa 103 - Stacking Boxes

【题目链接】 http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=114&page=show_...
  • shuangde800
  • shuangde800
  • 2012年08月19日 00:04
  • 2040

UVa - 103 - Stacking Boxes

动态规划。和嵌套矩形问题本质是一样的,不过这里不需要输出字典序最小的结果。 AC代码: #include #include #include #include #include #inclu...
  • zyq522376829
  • zyq522376829
  • 2015年07月02日 20:04
  • 585

UVa 103 - Stacking Boxes

题目:给你一些n维的盒子,问最多能套多少个在一起。 分析:dp,lis,最大上升子序列,贪心。             因为,对于两个盒子来说,维度按照递增序嵌套时是最大嵌套可能(可归纳证明);   ...
  • mobius_strip
  • mobius_strip
  • 2014年12月13日 22:21
  • 589

uva 103 Stacking Boxes

Background Some concepts in Mathematics and Computer Science are simple in one or two dimensions bu...
  • a_1_2_ab
  • a_1_2_ab
  • 2014年05月23日 08:43
  • 790

Uva 103 Stacking Boxes

#include #include #include #include #include #include #include #include #include #include using name...
  • zju2016
  • zju2016
  • 2016年05月25日 22:30
  • 134

uva 103 Stacking Boxes

类似最长上升子序列,但是这个大小关系并不是
  • u012183589
  • u012183589
  • 2014年07月09日 09:29
  • 347
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:uva:103 - Stacking Boxes
举报原因:
原因补充:

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