• 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;
    }
    
  • 相关阅读:
    redis环境搭建笔记
    mysql主从配置
    虚拟机下的hadoop集群环境搭建。
    maven 集成spring
    maven 集成spring ,mybatis
    andorid一个简单的短信发送程序
    android 一个简单的拨打电话程序
    hibernate 多对多双向关联
    hibernate 多对多注解配置
    hibernat 多对一注解配置
  • 原文地址:https://www.cnblogs.com/ziyi--caolu/p/3202511.html
Copyright © 2020-2023  润新知