dag: directed ayclic graph // 有向無環圖
劉汝佳:dag是動態規劃的基礎,很多問題都可以轉化成dag上的最短、最長或路徑計數問題
如nyoj 16
巢狀矩形問題,
描述有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
分析:學過離散數學都知道二元關係,顯然矩形巢狀關係可以看作乙個二元關係,而二元關係可以用圖來表示。而且,由於a解答:
1.儲存矩形:用結構體儲存
2.儲存二元關係圖:用二維陣列儲存,配對遍歷(n*n)所有矩形,利用條件:a3.定義函式dis(t):從t出發得到的最長路線,則所求為:最大的dis(i)。因此必須將所有的dis(i)給計算出來,進行打擂台求最大值。
4.求所有的dis(i):根據動態規劃的思想:將問題規模化小,轉移狀態,將問題規模縮小。從第i點開始考慮,面對每乙個與之相鄰的點 j 都可以選擇走和不走。
4-1.走:由於從第i點只能走到與之相鄰的點j,如果將第i點移到第j點,要計算dis(i) 則需要計算dis(j), 因為dis(i) = dis(j)+1(為什麼該等式成立請看:從 i 點考慮,dis(i)為從第 i點出發的最長長度,而第i點與第j點連通,所以第 i 點的最大長度dis(i)顯然可以加上dis[j](再加上i與 j之間的距離一般設定為1即可)還不懂的話:將 i 點看作 j 點的先導,打個比方:要到打飯視窗必須先到食堂門口,所以要求到打飯視窗的距離,只要求到食堂門口的距離再加上食堂門口到打飯視窗的距離(將食堂門口和打飯視窗看作兩個連通的點,這個距離就是我們設定的權重一般設定為1就可以對應題目所求數量))
就是要你懂_**:
(該圖為簡化後的二元關係圖圖中的圓圈表示二元關係圖中的點,有箭頭的線表示有向連通,距離是無論方向的,由圖很容易理解為什麼會存在dis[i] = dis[j] + 1這種情況)
4-2.不走:由於狀態沒有改變,dis(i)的值不發生變化。
5.得出動態轉移方程:dis(i) = max(dis(i),dis(j)+1), (i,j)∈e (e為邊集)
資料結構:
矩形:結構體陣列
二元關係圖:二維陣列
dis( ): 一維陣列
**:
#include#include#define max 500
#define max(a,b) a>b?a:b
typedef struct rectangle
rectangle;
int graph[max][max];//圖
rectangle rect[max];//矩形
int dis[max];//dis()
int n;
int dynamic_program(int i);
int dynamic_program(int i)
printf("%d\n",ans);
}return 0;
}
附上二元關係圖的二維陣列方便讀者驗證( 連通則為1,否則為0.)
0 1 1 1 1 0 1 1 1 0
0 0 1 1 1 0 1 1 1 0
0 0 0 1 1 0 0 1 1 0
0 0 0 0 0 0 0 1 0 0
0 0 0 0 0 0 0 1 0 0
0 1 1 1 1 0 1 1 1 0
0 0 0 1 1 0 0 1 1 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 1 0 0
0 0 1 1 1 0 1 1 1 0
動態規劃 DAG模型
有n個矩形,每個矩形可以用a,b來描述,表示長和寬。矩形x a,b 可以巢狀在矩形y c,d 中當且僅當a c,b d或者b c,a d 相當於旋轉x90度 例 1,5 可以巢狀在 6,2 內,但不能巢狀在 3,4 中。你的任務是選出盡可能多的矩形排成一行,使得除最後乙個外,每乙個矩形都可以巢狀在下...
動態規劃 DAG模型
dag 有向無環圖 上的動態規劃是學習動態規劃的基礎。有n個矩形,每個矩形可以用a,b來描述,表示長和寬。矩形x a,b 可以巢狀在矩形y c,d 中當且僅當a c,b d或者b c,a d 相當於旋轉x90度 例 1,5 可以巢狀在 6,2 內,但不能巢狀在 3,4 中。你的任務是選出盡可能多的矩...
DAG上的動態規劃
dag模型 有n個矩形,每個矩形用兩個整數a,b描述,表示長和寬,矩形 a,b 可以巢狀在矩形 c,d 中,當且僅當a小於c,b小於d或b小於c,a小於d。要解決的問題就是從眾多矩形中選出最多的矩形,使其可以按要求排成一列,若有多解,矩形編號的字典序要盡可能小。分析 按照書上的分析很簡單易懂,也容易...