nyoj16_矩形嵌套

原题链接》》》


基本思路:
1.先调整长宽(比如宽存为a,长存为b)
2.确定矩形大小关系,进行排序
3.找出矩形数组的最长单调递增子序列

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
struct Rect{
    int a;
    int b;
}s[1005];
int dp[1005];
int cmp(const void*a,const void*b){
    struct Rect*c=(Rect*)a;
    struct Rect*d=(Rect*)b;
    if(c->a!=d->a) return c->a-d->a;
    else return c->b-d->b;
}
int cmp1(const void *a,const void *b){
    return *(int *)a-*(int *)b;
}
int main(){
    int N,n,i,x,y;
    scanf("%d",&N);
    while(N--){
        scanf("%d",&n);
        for(i=0;i<n;i++){
            scanf("%d%d",&x,&y);
            s[i].a=(x<y?x:y);
            s[i].b=(x>y?x:y);
        }

        qsort(s,n,sizeof(s[0]),cmp);
        dp[0]=1;
        int max;
        for(int i=1;i<n;i++){
            max=0;
            for(int j=i-1;j>=0;j--){
                if(s[i].a>s[j].a&&s[i].b>s[j].b&&max<dp[j]){
                    max=dp[j];
                }
            }
            dp[i]=max+1;
        }
        qsort(dp,n,sizeof(int),cmp1);
        printf("%d\n",dp[n-1]);
    }
    return 0;
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值