1. 程式人生 > >DAG上的動態規劃之嵌套矩形問題

DAG上的動態規劃之嵌套矩形問題

style printf 硬幣 介紹 == 矩形 n) clas 歸約

據說DAG是動態規劃的基礎,想一想還真的是這樣的,動態規劃的所有狀態和轉移都可以歸約成DAG

DAG有兩個典型模型,一個是嵌套矩形問題一個是硬幣問題,這裏僅介紹一個嵌套矩形問題

等二輪復習的時候再補上

NYOJ16,南陽OJ很不錯的樣子嘛

如果矩形X可以嵌套到矩形Y中,連有向邊X->Y

求DAG的最長路徑

這裏起點和終點不用刻意給出,因為任意一個矩形都可以作為起點和終點

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 using namespace std;
 5 const
int maxn=1005; 6 int n; 7 int a[maxn],b[maxn],d[maxn]; 8 int G[maxn][maxn]; 9 int dfs(int x) 10 { 11 if(d[x]>0) return d[x]; 12 d[x]=1; 13 for(int i=1;i<=n;i++) 14 if(G[x][i]) d[x]=max(d[x],dfs(i)+1); 15 return d[x]; 16 } 17 void print_ans(int x) 18 { 19 printf("%d
",x); 20 for(int i=1;i<=n;i++) 21 if(G[x][i]&&d[x]==d[i]+1) 22 { 23 print_ans(i); 24 break; 25 } 26 } 27 int main() 28 { 29 int T; 30 scanf("%d",&T); 31 while(T--) 32 { 33 memset(d,0,sizeof(d)); 34 memset(a,0
,sizeof(a)); 35 memset(b,0,sizeof(b)); 36 memset(G,0,sizeof(G)); 37 scanf("%d",&n); 38 for(int i=1;i<=n;i++) 39 scanf("%d%d",&a[i],&b[i]); 40 for(int i=1;i<=n;i++) 41 for(int j=1;j<=n;j++) 42 { 43 if(a[i]>a[j]&&b[i]>b[j]||a[i]>b[j]&&b[i]>a[j]) 44 G[i][j]=1; 45 } 46 int tmp=0; 47 for(int i=1;i<=n;i++) 48 tmp=max(tmp,dfs(i)); 49 printf("%d\n",tmp); 50 } 51 52 return 0; 53 }

記憶化很舒適

DAG上的動態規劃之嵌套矩形問題