(dag模型 最長路 字典序)巢狀矩形

2021-08-22 04:29:47 字數 1216 閱讀 3558

有 n 個矩形,每個矩形可以用兩個整數 a, b 描述,表示它的長和寬。矩形 x(a, b) 可以巢狀在矩形 y(c, d) 中當且僅當 a<c, b<d,或者 b<c, a<d(相當於把矩形 x 旋轉了 90°)。例如 (1, 5) 可以巢狀在 (6, 2) 內,但不能巢狀在 (3, 4) 內。

你的任務是選出盡量多的矩形,使得除了最後乙個之外,每乙個矩形都可以巢狀在下乙個矩形內。

input

第一行乙個正整數 n (n <= 1000)。

接下來 n 行每行兩個正整數 a, b 表示矩形 i 的長和寬。

output

第一行乙個整數 k 表示符合條件的最多矩形數。

第二行 k 個整數依次表示符合條件矩形的編號,要求字典序最小。

sample input

8 14 9

15 19

18 12

9 10

19 17

15 9

2 13

13 10

sample output

4 4 8 3 2

dag意思是有向無環圖,所謂有向無環圖是指任意一條邊有方向,且不存在環路的圖

矩形之間的「可巢狀」關係是乙個典型的二元關係,二元關係可以用圖來建模。如果矩 形x可以巢狀在矩形y裡,就從x到y連一條有向邊這個有向圖是無環的,因為乙個矩形無 法直接或間接地巢狀在自己內部。換句話說,它是乙個dag。這樣,所要求的便是dag上 的最長路徑。方法

仿照數字三角形的做 法,設d(i)表示從結點i出發的最長路長度,第一步只能走到它 的相鄰點,狀態轉移方程:d(i) = max

for (int i=1;i<=n;i++)

for (int j=1;j<=n;j++)

if (((a[i]1;

for (int i=1;i<=n;i++)

if (f[i]==-1)

f[i]=dfs(i);

int ans=0;

for (int i=1;i<=n;i++)

if (f[i]>f[ans])

ans=i;

cout

int dfs (int i)

return ans;

}void print_ans(int i) }}

DAG之硬幣問題DP(最長路及其字典序)

問題描述 有n種硬幣,面值分別為v1,v2,v3,vn,每種都有無限多。給定非負整數s,可以選用多少個硬幣,使得面值之和恰好為s?輸出硬幣數目的最小值和最大值。1 n 100,0 s 10000,1 vi s.分析與思路 思路 本題是固定終點和起點的dag動態規劃。我們把每種面值看做乙個點,表示 還...

DAG最長路(最短路)

dag就是有向無環圖。dag上的最長或者最短路是很重要的一類問題。很多問題都可以轉化為dag上的最長或者最短路徑的問題。dag求最短和最長路的方法一樣。本演算法主要解決2個問題 1 求整個dag中的最長路徑 即不固定起點,也不固定終點 2 固定終點,求dag的最長路徑。dp i 表示從i 號頂點出發...

動態規劃四(DAG最長路)

在圖的有關知識中已經了解了dag就是有向無環圖,其中計算最長路 關鍵路徑 的做法非常複雜,這裡介紹更簡單的方法。求整個dag的最長路徑 即不固定起點和終點 固定終點,求dag的最長路徑。給定乙個有向無環圖,怎樣求解整個圖的所有路徑中權值之和最大的那條。令dp i 表示從i號頂點出發能獲得的最長路徑長...