可以帮我看看代码吗?我一句句打了注释,讨论一下思路吧qwq
查看原帖
可以帮我看看代码吗?我一句句打了注释,讨论一下思路吧qwq
523439
ACDG楼主2021/5/29 23:46

一起讨论一下思路吧,指教一下我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;
}
2021/5/29 23:46
加载中...