关闭

uva:103 - Stacking Boxes

187人阅读 评论(0) 收藏 举报

题目链接: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 ;
		}
	}
}

 

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:93553次
    • 积分:2463
    • 等级:
    • 排名:第15613名
    • 原创:167篇
    • 转载:1篇
    • 译文:0篇
    • 评论:0条