嵌套矩形——DAG上的动态规划(最长路问题)

##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;
}

猜你喜欢

转载自blog.csdn.net/weixin_43508782/article/details/85368000
今日推荐