DAG模型简单题

来源:互联网 发布:sql查询字段长度限制 编辑:程序博客网 时间:2024/05/22 06:33
 【题意】

有n个矩形,每个矩形都有长和宽,表示为a和b

矩形X(a,b)可以镶嵌在矩形Y(c,d)中当且仅当a<c , b<d 或者 a<d , b<c (相当于把矩形X旋转90°)

求出能嵌套在一个里面的最多数

 

【思路】

这是DP里的一种,先排序,在搜的时候记录深度,当找到可以嵌套的矩形时直接返回值

时间复杂度为O(n*n)

矩形的长和宽按照长>宽排列


#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;struct point{    int x,y;} p[100];int dp[100];int cmp(point a,point b){    if(a.x==b.x)        return a.y<b.y;    return a.x<b.x;}int main(){    int n;    freopen("in.txt","r",stdin);    freopen("out.txt","w",stdout);    while(cin>>n)    {        memset(p,0,sizeof(p));        for(int i=0; i<n; i++)        {            cin>>p[i].x>>p[i].y;            if(p[i].x>p[i].y)                swap(p[i].x,p[i].y);        }        sort(p,p+n,cmp);        int ans=0;        memset(dp,0,sizeof(dp));        for(int i=0; i<n; i++)        {            for(int j=0; j<i; j++)            {                if(p[j].x<p[i].x&&p[j].y<p[i].y)                {                    dp[i]=max(dp[i],dp[j]+1);//状态转移方程(使得一个一个递增找最大值)                }            }            if(dp[i]==0)dp[i]=1;             ans=max(ans,dp[i]);        }        printf("%d\n",ans);    }    return 0;}


0 0
原创粉丝点击