DAG 矩形覆盖

版权声明:转载请注明出处 https://blog.csdn.net/qq_39541141/article/details/85452810

题面

这是紫书上的一道例题

        有n个矩形,每个矩形可以用a,b来描述,表示长和宽。矩形X(a,b)可以嵌套在矩形Y(c,d)中当且仅当a<c,b<d或者b<c,a<d(相当于旋转X90度)。例如(1,5)可以嵌套在(6,2)内,但不能嵌套在(3,4)中。你的任务是选出尽可能多的矩形排成一行,使得除最后一个外,每一个矩形都可以嵌套在下一个矩形内。如果有多解,矩形编号的字典序应尽量小

思路

        对于本题中的n个矩形,以每个矩形作为一个点,若X矩形能嵌套在Y矩形中,则从X向Y连一条边,题目则变为了在DAG中求最长路径的问题。对每一个矩形i,设d(i)为矩形i结尾的最长链的长度,那么d(i)=Max{0,d(j)(矩形j可以嵌套在矩形i中)+1};

代码

#include<iostream>
using namespace std;
int n,a[1002],b[1002],ans,dp[1002];
bool d[1002][1022];
int dop(int cnt){//记搜找最长的路径
	if(dp[cnt]>0)return dp[cnt];int temp=1;
	for(register int i=1;i<=n;i++)
	  if(d[cnt][i])temp=max(temp,dop(i)+1);		
	return dp[cnt]=temp;
}
int main()
{
	cin>>n;
	for(int i=1;i<=n;i++)cin>>a[i]>>b[i];
	for(int i=1;i<=n;i++)
	  for(int l=1;l<=n;l++)
	    if((a[i]<b[l]&&b[i]<a[l])||(a[i]<a[l]&&b[i]<b[l]))
	      d[i][l]=1;//连边
	for(register int i=1;i<=n;i++)ans=max(dop(i),ans);
	cout<<ans<<endl;
	return 0;
}

总结

难点主要在于是否能将实际转换成DAG(有向无环图)一个模型

然后注意记搜的细节

猜你喜欢

转载自blog.csdn.net/qq_39541141/article/details/85452810
DAG
今日推荐