巢狀矩形——DAG上的動態規劃(最長路問題)
阿新 • • 發佈:2018-12-30
##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;
}