• nyoj16 矩形嵌套 记忆搜索+动态 数组引用


    矩形嵌套

    时间限制:3000 ms  |  内存限制:65535 KB
    难度:4
    描述
    有n个矩形,每个矩形可以用a,b来描述,表示长和宽。矩形X(a,b)可以嵌套在矩形Y(c,d)中当且仅当 a<c,b<d或者b<c,a<d(相当于旋转X90度)。例如(1,5)可以嵌套在(6,2)内,但不能嵌套在(3,4)中。 你的任务是选出尽可能多的矩形排成一行,使得除最后一个外,每一个矩形都可以嵌套在下一个矩形内。
    输入
    第一行是一个正正数N(0<N<10),表示测试数据组数,
    每组测试数据的第一行是一个正正数n,表示该组测试数据中含有矩形的个数(n<=1000)
    随后的n行,每行有两个数a,b(0<a,b<100),表示矩形的长和宽
    输出
    每组测试数据都输出一个数,表示最多符合条件的矩形数目,每组输出占一行
    样例输入
    1
    10
    1 2
    2 4
    5 8
    6 10
    7 9
    3 1
    5 8
    12 10
    9 7
    2 2
    
    样例输出
    5
    View Code
    #include<stdio.h>
    #include<string.h>
    int g[101][101],t[101],n;
    int dp(int i)
    {
        int &ans=t[i];
        if(ans>0)
            return ans;
        ans=1;
        for(int j=1;j<=n;++j)
            if(g[i][j])
                if(ans<dp(j)+1)
                    ans=dp(j)+1;
        return ans;
    }
    
    int main()
    {
        int x,a[101],b[101];
        int i,j,max;
        scanf("%d",&x);
        while(x--)
        {
            scanf("%d",&n);
            memset(t,0,sizeof(t));
            memset(g,0,sizeof(g));
            for(i=1;i<=n;i++)
                scanf("%d%d",&a[i],&b[i]);
            for(i=1;i<=n;i++)
                for(j=1;j<=n;j++)
                    if((a[i]>a[j]&&b[i]>b[j])||(a[i]>b[j]&&b[i]>a[j])) 
                        g[i][j]=1;
            max=-1;
            for(i=1;i<=n;++i)
                if(dp(i)>max)
                    max=dp(i);
            printf("%d\n",max);
        }
        return 0;
    }

    1.刚接到这个提时 啥也没想就用动态去做了,提交一看WA,后来发现不是这个套那个后,其他套还能套,因为是两个变量,不能单纯的 递推来判定。要一一比较 标记

    2.第二步 需要注意的 数组的引用,    int &ans=t[i];  在后面ans改变时 对应的数组t[i]也会改变

    3.后来还是WA了好多次,检查了好久才 发现是 在输入时直接 标记啦,惯性思维造成的错误

  • 相关阅读:
    大型项目生产环境日志查询
    泛型接口和泛型方法
    使用360浏览器登录B站的时候,不显示搜索框
    构建之法第二周学习体验
    构建之法首周阅读体会
    C语言实例解析精粹学习笔记——26
    C语言实例解析精粹学习笔记——29
    C语言实例解析精粹学习笔记——28
    C语言实例解析精粹学习笔记——18
    C语言实例解析精粹学习笔记——30
  • 原文地址:https://www.cnblogs.com/zibuyu/p/2941063.html
Copyright © 2020-2023  润新知