矩阵嵌套

来源:互联网 发布:excel数据分析功能 编辑:程序博客网 时间:2024/05/21 17:02

题目描述

有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),表示矩形的长和宽

输出

每组测试数据都输出一个数,表示最多符合条件的矩形数目,每组输出占一行

样例输入

1101 22 45 86 107 93 15 812 109 72 2

样例输出

5


#include <cstdio>#include <algorithm>#include <iostream>using namespace std;struct play{int a,b;}z[1001];bool ccp(play x, play y){return x.a<x.b;}int main(){int N;cin>>N;while(N--){int n;cin>>n;for(int i=0;i<n;i++){cin>>z[i].a>>z[i].b;if(z[i].b>z[i].a){int temp=z[i].a;z[i].a=z[i].b;z[i].b=temp;}}int sum=1;sort(z,z+n,ccp);play b[101];b[0]=z[0];for(int i=1;i<n;i++){if(z[i].a>b[0].a&&z[i].b>b[0].b){b[0]=z[i];sum++;}}cout<<sum<<endl;}return 0;}


动态规划做法:

#include <iostream>  #include <stdio.h>  #include <string.h>  #include <stdlib.h>  #include <algorithm>  #define MAX 1001  using namespace std;    struct Data  {      int x;      int y;  }data[MAX];    int ans[MAX];    bool cmp(Data a, Data b)            //排序函数  {      if(a.x == b.x)      {          return a.y < b.y;      }      else      {          return a.x < b.x;      }  }    int main()  {      int t, n, i, j, max, tempx, tempy;       scanf("%d", &t);      while(t--)      {          memset(ans, 0, sizeof(ans));          scanf("%d", &n);          for(i = 0; i < n; i++)          {              scanf("%d%d", &tempx, &tempy);              if(tempx < tempy)              {                  data[i].x = tempx;           //录入时确保x为宽y为长                  data[i].y = tempy;              }              else              {                  data[i].x = tempy;                  data[i].y = tempx;              }          }          sort(data, data+n, cmp);          for(i = 0; i < n; i++)             //初始化为1          {              ans[i] = 1;          }          for(i = 1; i < n; i++)          {              max = 0;              for(j = i-1; j >= 0; j--)        //寻找最大元素小于data[i]的最长子序列              {                  if(data[i].x > data[j].x && data[i].y > data[j].y  && ans[j] > max)                  {                      max = ans[j];                  }              }              ans[i] = max + 1;          }          max = 0;          for(i = 0; i < n; i++)          {              if(ans[i] > max)              {                  max = ans[i];                //遍历结果数组找最长子序列(长度)              }          }          printf("%d\n", max);      }  }  



原创粉丝点击