1. 程式人生 > >巢狀矩形——DAG上的動態規劃(最長路問題)

巢狀矩形——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; }