矩形嵌套_嵌套

矩形用 1 2 3 4 5  来表示

表示与能否嵌套并无关系    箭头指向表示能够被嵌套

如图:3  所能嵌套的数目是最多的 

 路径          1—>5—>4—>3   

于是这个问题就被转化为了求一个  无权有向图   的最长路径

只是这个图需要我们自己进行创造出来

用一个二维数组表示g[i][j]

表示矩形i能够嵌套进入矩形[j]

#include<iostream>
using namespace std;
const int N = 1010;
int g[N][N];
int d[N];
int n;
struct Rec {
int wig, heg;
}rec[1010];
//查询 矩形 x 所能嵌套的最大个数
int dp(int x)
{
if (d[x])return d[x];//如果d[x]已经得到过 直接返回 记忆化搜素
int ans = 1;
for (int i = 1; i <= n; i++)
{
if (g[i][x])//遍历从 1 到 n 矩形能否放进 矩形 x种
{
ans = max(ans, dp(i) + 1);
}
}
d[x] = ans;
return ans;
}
int main()
{
cin >> n;
//所有矩形得到
for (int i = 1; i <= n; i++)
{
cin >> rec[i].wig >> rec[i].heg;
}
//判断矩形之间是否能够进行嵌套
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
{
if (rec[i].wig < rec[j].wig && rec[i].heg < rec[j].heg || rec[i].wig < rec[j].heg && rec[i].heg < rec[j].wig)
{
g[i][j] = 1;
}
}
}
//比较完毕 遍历所有矩形嵌套的最大值个数
int ans = 1;//最低限度
for (int i = 1; i <= n; i++)
{
ans = max(ans, dp(i));
}
return 0;
}

引用博客:​​矩形嵌套_turingwy的博客-CSDN博客_矩形嵌套​