DAG上的動態規劃之嵌套矩形問題
阿新 • • 發佈:2018-08-14
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 constint 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上的動態規劃之嵌套矩形問題