nyoj16矩形嵌套(第一道dp关于dag的题目)

http://acm.nyist.net/JudgeOnline/problem.php?pid=16

题意:有n个矩形,每个矩形可以用a,b来描述,表示长和宽。矩形X(a,b)可以嵌套在矩形Y(c,d)中当且仅当a<c,b<d或者b<c,a<d(相当于旋转X90度)。例如(1,5)可以嵌套在(6,2)内,但不能嵌套在(3,4)中。你的任务是选出尽可能多的矩形排成一行,使得除最后一个外,每一个矩形都可以嵌套在下一个矩形内。

思路:先对长和宽来此排序,再按照要求构图,完成之后,直接记忆化搜索,值得注意的地方是你不能只从第一个点搜索,而是要从每个点搜索.......我自己想的时候想到这个了,编写的时候忘了,wa一次..........

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define maxx 10000000
struct node
{
	int x,y;
}s[1100];
int vist[1100][1100],n,dp[1100];

int cmp(const node a,const node b)
{
	if(a.x<b.x)
	return 1;
	else if(a.x==b.x&&a.y<b.y)
	return 1;
	else return 0;
}
int dfs(int num)
{
	if(dp[num]>0) return dp[num];
	dp[num]=1;
	for(int i=1;i<=n;i++)
	{
		if(vist[num][i]) 
		{
			int tmp=dfs(i)+1;
			if(dp[num]<tmp)
			dp[num]=tmp;
		}
	}
	return dp[num];
}
int main()
{
	int text;
	scanf("%d",&text);
	while(text--)
	{
		scanf("%d",&n);
		memset(vist,0,sizeof(vist));
		memset(dp,0,sizeof(dp));
		for(int i=1;i<=n;i++)
		{
			int x,y;
			scanf("%d%d",&x,&y);
			s[i].x=x;
			s[i].y=y;
		}
		sort(s+1,s+1+n,cmp);
		for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
		{
			if((s[i].x<s[j].x&&s[i].y<s[j].y)||(s[i].x<s[j].y&&s[i].y<s[j].x))
			{
				vist[i][j]=1;
			}
		}
		int maxn=0;
		for(int i=1;i<=n;i++)
		{
			int tmp1=dfs(i);
			if(tmp1>maxn)
			maxn=tmp1;
		}
		printf("%d
",maxn);
	}
	return 0;
}
原文地址:https://www.cnblogs.com/ziyi--caolu/p/3202511.html