题目描述

有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

WA:运行错误50% ,不清楚原因...

#include <iostream>
#include <algorithm>
using namespace std;const int maxn = 1010;
const int inf = 1000000000;
struct node
{int a, b;
}Node[maxn];int G[maxn][maxn];
int dp[maxn];
int N; //测试组数
int n; //含有矩形个数
int ans = -1;int DP(int i)
{if(dp[i] > 0) return dp[i];dp[i] = 1;for(int j = 1; j <= n; j++){if(G[i][j] != inf){int temp = DP(j) + G[i][j];if(temp > dp[i]){dp[i] = temp;}}}return dp[i];
}int main()
{scanf("%d", &N);while(N--){//输入scanf("%d", &n);fill(G[0], G[0]+maxn*maxn, inf);fill(dp, dp+maxn, 0);for(int i = 1; i <= n; i++){scanf("%d%d", &Node[i].a, &Node[i].b);if(Node[i].a > Node[i].b) swap(Node[i].a, Node[i].b);}for(int i = 1; i <= n; i++){for(int j = 1; j <= n; j++){if( (Node[i].a < Node[j].a && Node[i].b < Node[j].b)){G[i][j] = 1;}}}for(int i = 1; i <= n; i++){ans = max(ans, DP(i));}printf("%d\n", ans);}return 0;}

别人的代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=1e3+10;
int G[maxn][maxn];
struct node
{int x,y;
};
node a[1001];
int d[1001];
int n;
bool cmp(node a,node b)
{if(a.x<=b.x) return 1;else if(a.x==b.x&&a.y<=b.y) return 1;else  return 0;
}
void creat()
{memset(G,0,sizeof(G));for(int i=1;i<=n;i++) for(int j=1;j<=n;j++)if(a[i].x<a[j].x&&a[i].y<a[j].y) G[i][j]=1;
}
int dp(int i)
{if(d[i]>0) return d[i];d[i]=1;for(int j=1;j<=n;j++){if(G[i][j]==1){int t=dp(j);d[i]=max(d[i],t+1);}}return d[i];
}
int main()
{int _;scanf("%d",&_);while(_--){scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%d%d",&a[i].x,&a[i].y);if(a[i].x>a[i].y) swap(a[i].x,a[i].y);}//sort(a+1,a+1+n,cmp);memset(d,0,sizeof(d));creat();int mx=0;for(int i=1;i<=n;i++){int t=dp(i);mx=max(mx,t);}printf("%d\n",mx);}
} 上面那个代码是不是比较难理解,那看看下面这个优化的代码,是不是感觉很神奇的感觉。如此完美的优化了先将矩形从大到小排序,然后dp[i]代表当前i的最长矩形嵌套长度为多少。#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=1e3+10;
int G[maxn][maxn];
struct node
{int x,y;
};
node a[1001];
int dp[1001];
int n;
bool cmp(node a,node b)
{if(a.x==b.x) return a.y>b.y;return a.x>b.x;
}int main()
{int _;scanf("%d",&_);while(_--){scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%d%d",&a[i].x,&a[i].y);if(a[i].x>a[i].y) swap(a[i].x,a[i].y);}sort(a+1,a+1+n,cmp);memset(dp,0,sizeof(dp));int ans=0;for(int i=1;i<=n;i++){dp[i]=1;for(int j=1;j<i;j++){if(a[i].x<a[j].x&&a[i].y<a[j].y){dp[i]=max(dp[i],dp[j]+1);}}ans=max(ans,dp[i]);}cout<<ans<<endl;}
}
---------------------
作者:ccsu_deer
来源:CSDN
原文:https://blog.csdn.net/qq_41286356/article/details/85043571
版权声明:本文为博主原创文章,转载请附上博文链接!

Codeup-问题 A: 问题 A: 矩形嵌套相关推荐

  1. NYOJ 16(矩形嵌套)

    矩形嵌套 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 有n个矩形,每个矩形可以用a,b来描述,表示长和宽.矩形X(a,b)可以嵌套在矩形Y(c,d)中当且仅当a< ...

  2. nyoj 16 矩形嵌套 (DAG上的DP)

    矩形嵌套 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 有n个矩形,每个矩形可以用a,b来描述,表示长和宽.矩形X(a,b)可以嵌套在矩形Y(c,d)中当且仅当a< ...

  3. NYOJ 16 矩形嵌套

    矩形嵌套 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 有n个矩形,每个矩形可以用a,b来描述,表示长和宽.矩形X(a,b)可以嵌套在矩形Y(c,d)中当且仅当a< ...

  4. NYOJ 16 矩形嵌套(动态规划)

    矩形嵌套 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 有n个矩形,每个矩形可以用a,b来描述,表示长和宽.矩形X(a,b)可以嵌套在矩形Y(c,d)中当且仅当a< ...

  5. NYOJ_16_矩形嵌套

    有点小坑的严格单调递增序列,主要是排序那里坑了一下. 思路:矩形的嵌套?   (a<c&&b<d)||(a<d&&b<c)?  不,只要在建点时 ...

  6. 矩形嵌套 南阳理工ACM

    描述 有n个矩形,每个矩形可以用a,b来描述,表示长和宽.矩形X(a,b)可以嵌套在矩形Y(c,d)中当且仅当a<c,b<d或者b<c,a<d(相当于旋转X90度).例如(1, ...

  7. 矩形嵌套(NYOJ-16)

    描述 有n个矩形,每个矩形可以用a,b来描述,表示长和宽.矩形X(a,b)可以嵌套在矩形Y(c,d)中当且仅当a<c,b<d或者b<c,a<d(相当于旋转X90度).例如(1, ...

  8. 南阳OJ 16 矩形嵌套

    描写叙述 有n个矩形,每个矩形能够用a,b来描写叙述,表示长和宽. 矩形X(a,b)能够嵌套在矩形Y(c,d)中当且仅当a<c,b<d或者b<c,a<d(相当于旋转X90度). ...

  9. UVA437 巴比伦塔 The Tower of Babylon(矩形嵌套进阶版、DAG上DP、记忆化搜索)

    整理的算法模板合集: ACM模板 本题和基础的矩形覆盖差不多,只不过变成了三维的长方形. 因为每次转移的时候只有顶面的x和y会影响决策的进行,所以我们只需要用一个二元组(a,b)(a, b)(a,b) ...

最新文章

  1. thinkphp3.1的新功能
  2. CD marker 是什么?
  3. Single System Image的理解
  4. 902. 最短编辑距离
  5. 驰骋工作流引擎-总体介绍
  6. Chrome插件(Extensions)开发攻略
  7. 西门子 dp通讯测试软件,西门子 PLC DP通讯
  8. 瑞星云安全截获新感染病毒 6月感染网民263万
  9. IE浏览器不能使用window.open()的解决方案
  10. 主题:讲解三层代码讲解(ActiveList的Action的工作方式)--第五课(*****) DATE:2004-06-03...
  11. C语言 判断某一日期是星期几
  12. 关于iphone5和iphone4兼容的尺寸问题
  13. 如何将企业微信好友设置为外部联系人
  14. 轻盈潇洒卓然不群,敏捷编辑器Sublime text 4中文配置Python3开发运行代码环境(Win11+M1 mac)
  15. 怎么预防和清除计算机病毒,预防和清除计算机病毒的方法
  16. 渗透测试第一弹:信息刺探
  17. 3D Tiles 简单介绍
  18. 马的Hamilton周游路线问题
  19. JS 判断手机端跳转
  20. android屏幕抓取,Android抓取屏幕展示 内容(类似屏幕截图)

热门文章

  1. PyCairo 中的剪裁和屏蔽
  2. Caddy Web服务器QUIC部署
  3. 再看Kafka Lag
  4. RabbitMQ之镜像队列
  5. C++中类的6个默认成员函数
  6. 一文简述FFmpeg
  7. 杨攀:融云专注极致技术 不忘初心打造极简体验
  8. 14W 行代码量的前端页面长什么样
  9. AI 到底是怎么「想」的?
  10. curl-loader介绍