- 输入
-
第一行是一个正正数N(0<N<10),表示测试数据组数,
每组测试数据的第一行是一个正正数n,表示该组测试数据中含有矩形的个数(n<=1000)
随后的n行,每行有两个数a,b(0<a,b<100),表示矩形的长和宽 - 输出
每组测试数据都输出一个数,表示最多符合条件的矩形数目,每组输出占一行
状态转移方程 :d[i]=max{d[j]+1|(i,j)属于E} //找不到属于这个符号,只能文字代替了。。。 还有E为边集哦。
提示:此题为DAG模型,属于有向无环图。
代码如下:
#include <iostream> #include <cstring> #include <algorithm> #include <stdio.h> using namespace std; #define maxd 1005 struct rectangular { int length; int width; }a[maxd]; int n; int d[maxd]; int G[maxd][maxd]; void build() { //通过2维数组G[i][j]建立邻接矩阵 for (int i = 0; i < n; i++) for (int j = 0; j < n; j++) { if ((a[i].length>a[j].length&&a[i].width>a[j].width || a[i].length >a[j].width&&a[i].width > a[j].length) && i != j) G[i][j] = 1; else G[i][j] = 0; } } int dp(int i) { //递归做法求从第i个为起点的嵌套最大值 int &ans = d[i]; if (ans > 0) return ans; ans = 1; for (int j = 0; j < n; j++) if(G[i][j]) ans = max(ans, dp(j) + 1); return ans; } int main() { int N; scanf("%d", &N); while (N--) { memset(d, 0, sizeof(d)); scanf("%d", &n); for (int i = 0; i < n;i++) scanf("%d%d", &a[i].length,&a[i].width); build(); int maxlong=0; for (int i = 0; i < n; i++) { //求出所有d[i]的最大值即为嵌套最大值 int anss = dp(i); if (anss > maxlong) maxlong = anss; } printf("%d\n", maxlong); } return 0; }