原题:
描述-
输入
-
第一行是一个正正数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
#include<stdio.h>
#include<algorithm>
using namespace std;
struct rec {
int len, wid;//len 长边,wid 短边
};
bool cmp(struct rec a1, struct rec a2) {//按照长的大小排序,假如长度一样,以宽度的大小排序
if (a1.len == a2.len)return a1.wid < a2.wid;
return a1.len < a2.len;
}
int main() {
int n;
scanf("%d", &n);//数据组数
while (n--) {
int m, a, b;
struct rec s[1000];
scanf("%d", &m);//矩形个数
int i = 0;
int temp = m;
while (temp--) {
scanf("%d%d", &a, &b);//临时储存数据
if (a > b) {//保证长度一定大于或者等于宽度
s[i].len = a;
s[i].wid = b;
i++;
}
else {
s[i].len = b;
s[i].wid = a;
i++;
}
}
sort(s, s + m, cmp);//对输入数据进行升序排序。
int dp[1000];
for (i = 0; i < m; i++) {
dp[i] = 1;
for (int j = 0; j < i; j++) {//动态规划
if (s[i].len > s[j].len&&s[i].wid > s[j].wid) {
dp[i] = dp[i] > dp[j] ? dp[i] : (dp[j] + 1);
}
}
}
sort(dp, dp + m);//对dp数组进行升序排序
printf("%d\n", dp[m - 1]);
}
return 0;
}
采用了动态规划的思想。与我上一篇‘单调递增子序列’的解题方式一样。如果不理解可以去看看那题。还是那句话,假如看不懂我的解题过程或者我想表达的意思,建议去Google动态规划。知乎那里也已经有大神对动态规划解释的很清楚了, 这里就不再赘述了。