一起讨论一下思路吧,指教一下我qwq
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N = 1000;//定义数组最大长度
int dp[N]; //存储记忆化数据
int w[N], h[N]; //存储矩形的长和宽
int G[N][N]; //存储DAG模型
int n, wmin, hmin; //存储矩形(顶点)个数以及最小矩形尺寸要求
int P[N]; //存储路径
int solve(int x) //求以编号为x的矩形为起点的最长嵌套序列
{
if (dp[x] != -1)return dp[x];//如果不为-1返回计算过的值
if (w[x] <= wmin && h[x] <= hmin)return dp[x] = 0;//如果不大于最小序值则不算
int max = 0;
for (int i = 0; i < n; i++)//依次求出邻接状态的最大值
{
if (G[x][i])//如果有边则求其状态值
{
int zhi = solve(i);
if (zhi > max)max = zhi;
P[x] = i;//并且记录最大的上一个,即路径
}
}
//cout << "dp[" << x << "]" << "=" << dp[x] << " max=" << max << endl;
return dp[x] = max + 1;//状态转移赋值返回
}
int main()
{
cin >> n >> wmin >> hmin;//输入基本数据
for (int i = 0; i < n; i++)//输入矩阵
{
cin >> w[i] >> h[i];
}
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)//为矩阵建立边
{
bool x = 0,y=0;
if (w[i] > h[i]) {//将矩阵转换为长大于宽的规范,更易于判断嵌套
x = 1;
swap(w[i], h[i]);
}
else if (w[j] > h[j]) {//将矩阵转换为长大于宽的规范,更易于判断嵌套
y = 1;
swap(w[i], h[i]);
}
if (w[i] < w[j] && h[i] < h[j])//如果可嵌套则建立有向边
{
G[i][j] = 1;
}
else if (w[i] > w[j] && h[i] > h[j])//同上
{
G[j][i] = 1;
}
if (x)//如果转换过就转换回来,因为判断w>win是不能转动的
swap(w[i], h[i]);
if (y)
swap(w[i], h[i]);
}
}
memset(dp, -1, sizeof(dp));//初始化两个数组
memset(P, -1, sizeof(P));
int max = 0, maxi = 0;
for (int i = 0; i < n; i++)//从每一个矩阵出发求路径长度
{
int zhi = solve(i);
if (zhi > max)
{
max = zhi;
maxi = i;
}
}
cout << max << endl;//输出最大值
cout << maxi + 1; //输出起点
while (P[maxi] != -1)//输出路径
{
cout << " " << P[maxi] + 1;
maxi = P[maxi];
}
return 0;
}