矩形嵌套问题-NYOJ 16

//本文为转载,设为私密文章我自己也不方便看,大家最好自己去看原文,支持一下作者!!!链接稍后放上

16-矩形嵌套
//长方形的长要大于宽
内存限制:64MB 时间限制:3000ms Special Judge: No
accepted:13 submit:28
题目描述:
有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

分析:
  贪心 + 动态规划

步骤:
  ①、根据宽度、长度的优先级进行由小到大的排序(贪心)
  ②、从前到后遍历每一个节点(k),而对应与该节点的最大值情况是根据前面(k-1)个节点确定的
  ③、根据状态方程 dp[i] = max(dp[i], dp[j] + 1); 对满足条件的每一个点进行求值

核心代码:

1 for(int i = 0; i < n; ++ i)
2 {
3     dp[i] = 1;
4     for(int j = 0; j < i; ++ j)
5     {
6         dp[i] = max(dp[i], dp[j] + 1);
7     }
8 }
9 printf("%d\n", dp[n-1]); //dp[n-1]即为最多个数
  #include <iostream>
  #include <algorithm>
  #include <cstring>
  #include <cstdio>
  #include <cmath>
  #include <stack>
  #include <map>
  #include <queue>
  
 using namespace std;
 const int MAXN = 1010;
 int dp[MAXN];
 struct node
 {
     int w, l; // w宽,l长
 }P[MAXN];
  
 bool cmp(node a, node b)
 {
     return (a.w != b.w)?(a.w < b.w):(a.l < b.l);
 }
 
 int main()
 {
     int t, a, b, n;
     scanf("%d", &t);
     while(t --)
     {
         scanf("%d", &n);
         for(int i = 0; i < n; ++ i)
         {
             scanf("%d%d", &a, &b);
             P[i].w = min(a, b); // 前几次一直wr,结果才是因为左边的不一定就是宽
             P[i].l = max(a, b);
         }
 
         sort(P, P+n, cmp);
         memset(dp,0,sizeof(dp));
         for(int i = 0; i < n; ++ i)
         {
             dp[i] = 1;
             for(int j = 0; j < i; ++ j)
             {
                 if(P[j].l < P[i].l && P[j].w < P[i].w)
                     dp[i] = max(dp[i], dp[j] + 1);
             }
         }
        printf("%d\n", dp[n-1]);
     }
     return 0;
 }

2018/11/24
总结:这是网上找的时间复杂度为n^2的代码,应该是最好的模板了,而且代码很简洁易懂。
明天上午有答辩和三份报告还要复习两门功课,暂时先不细看,最迟要在12月3日,也就是下周日前搞懂。
好吧,没有等到12月,我今天就搞完了,但是这位大神,卧槽,dp都没有初始化,居然给我输出了正确结果,我…em…难道要说大神不愧是大神吗!?我自己做了一遍测试,将memset对于dp初始化为0放在了sort之后,发现也没有什么问题,突然想起来C++对于数组的默认赋值是为0的,也就是说memset函数在只有一组的测试样例中是可以不要的,OK,疑惑解决掉了,那还是加上去吧!
话说到现在为止,我还是不怎么会用vector,改天抽时间看看吧,over!
//原文地址是博客园 作者GetcharZP,各位自己搜吧,链接我还不大会放。

猜你喜欢

转载自blog.csdn.net/weixin_43227938/article/details/84452320
今日推荐