##DAG上的动态规划
嵌套矩形问题
Description:
有n个矩形,每个矩形可以用两个整数a、b描述,表示它的长和宽。矩形X(a,b)可以嵌套在矩形Y(c,d)中,当且仅当 a<c,b<d,或者b<c,a<d(相当于把矩形旋转90°)。例如,(1,5)可以嵌套在(6,2)内,但不能嵌套在(3,4)内。你的任务是选出尽可能多的矩形排成一行,使得除了最后一个之外,每一个矩形都可以嵌套在下一个矩形内。
输出最大的矩形数
AC代码如下
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn=50;
bool G[maxn][maxn]; //用来储存边关系。
int d[maxn];
struct Rectangle
{
int length; //长
int width; //宽
};
int dp(int i,int n)
{
if(d[i]>0)
return d[i];
d[i]=1; //因为每一个矩形都代表着一个距离(当然这个不能放在上面if语句的前面,不然不执行dp了)
for(int j=0;j<n;j++){
if(G[i][j]) //说明可以相连,那么就比较一下 dp[i]和 dp(j)+1 也就是顺着下一个j继续寻找两者取最大
d[i]=max(d[i],dp(j,n)+1);
}
return d[i];
}
int main()
{
Rectangle rec[maxn]; //有maxn个矩形。
int n; //代表输入的矩形数
cin>>n;
int templong,tempwidth;
for(int i=0;i<n;i++){
cin>>templong>>tempwidth;
rec[i].length= (templong>tempwidth ? templong : tempwidth);
rec[i].width= (templong<tempwidth ? templong : tempwidth);
}
//创建矩形之间的关系(用邻接矩阵) G[i][j] 代表 j能够放进i里面。
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(rec[i].length>rec[j].length && rec[i].width>rec[j].width)
G[i][j]=true;
}
}
memset(d,-1,sizeof(d)); //初始化。
for(int i=0;i<n;i++)
dp(i,n);
cout<<*max_element(d,d+n)<<endl;
return 0;
}