DAG上的動態規劃

2021-08-01 10:37:26 字數 1315 閱讀 9887

時間限制:

3000 ms  |  記憶體限制:

65535 kb

難度:4 描述

有n個矩形,每個矩形可以用a,b來描述,表示長和寬。矩形x(a,b)可以巢狀在矩形y(c,d)中當且僅當a

輸入

第一行是乙個正正數n(0輸出

每組測試資料都輸出乙個數,表示最多符合條件的矩形數目,每組輸出佔一行

樣例輸入

1

101 2

2 45 8

6 10

7 93 1

5 812 10

9 72 2

樣例輸出

5

題意描述: 有n個矩形,每個矩形可以用兩個整數a、b描述,表示它的長和寬,

矩形(a,b)可以巢狀在矩形(c,d)當且僅當a

要求選出盡量多的矩形排成一排,使得除了最後乙個外,

每乙個矩形都可以巢狀在下乙個矩形內,如果有多解,矩形編號的字典序應盡量小

解題思路:<1>矩形之間的可巢狀關係是乙個"二元關係",二元關係可以用圖來建模。

如果矩形x可以巢狀在矩形y裡,就從x到y連一條有向邊(g[x][y]=1)。

這個圖是無環的,因為乙個矩形無法直接或間接地巢狀在自己內部,

換句話說,他是乙個dag。

這樣,原問題便轉化為求dag上的最長路徑。

<2>那麼如何求dag最長上的最長路徑呢?

可定義狀態: dp[i]表示從結點i出發所能到達的最長路徑的長度

那麼: dp[i] = max(dp[j]) + 1, 其中g[i][j]=1,即i可巢狀在j中

最後陣列d中的最大值便是結果

<3>如何保證最小字典序?

在所有的d都計算出來以後,選擇最大的d[i]所對應的i。

如果有多個i,選擇最小的i。(i即第乙個起點)

接下來可以選擇d[i] = d[j]+1且(i,j)為邊集的任何乙個j,

但為了保證字典序最小,應該選擇其中最小的j,

#include #include #include using namespace std;

const int maxn=1005;

int t,n;

int len[maxn],wid[maxn];

int g[maxn][maxn];

int d[maxn],best=-(1<<30);

void build() //建圖

build();

for(int i=0;idp(i);

cout<} return 0;

}

DAG上的動態規劃

dag模型 有n個矩形,每個矩形用兩個整數a,b描述,表示長和寬,矩形 a,b 可以巢狀在矩形 c,d 中,當且僅當a小於c,b小於d或b小於c,a小於d。要解決的問題就是從眾多矩形中選出最多的矩形,使其可以按要求排成一列,若有多解,矩形編號的字典序要盡可能小。分析 按照書上的分析很簡單易懂,也容易...

DAG 上的動態規劃

暫存 dag 上的動態規劃 訓練指南 大白書 2015年11月04日 16 42 48 閱讀數 1979 有向無環圖 dag,directed acyclic graph 上的動態規劃是學習動態規劃的基礎。很多問題都可以轉化為dag上的最長路 最短路或路徑計數問題。一 矩形巢狀 題目描述 有n個矩形...

DAG上的動態規劃

如需要課件ppt,聯絡我 dag 的定義 dag 意思是有向無環圖,所謂有向無環圖是指任意一條邊有方向,且不存在環路的圖。注 並非是一棵樹,邊數可以 經典例題 巢狀矩形 有n 個矩形,每個矩形可以用 ab來描述,表示長和寬。矩形 x ab 可以巢狀在矩形 y cd 中當且僅當 a或者b 相當於旋轉 ...