DAG(无回路有向图)的最长路 嵌套矩形
题目:http://acm.nyist.net/JudgeOnline/problem.php?pid=16
思路:d(i)=max{0,d(j)矩形j可以嵌套在矩形i中}+1
记忆化搜索,否则会超时:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<stdio.h> 2 #include<string.h> 3 const int N=1005; 4 int a[N],b[N]; 5 bool map[N][N]; 6 int dp[N]; 7 int T,n; 8 int DP(int i){ 9 int &ans=dp[i]; 10 if(dp[i]!=0) return ans; 11 ans=1; 12 for(int j=0;j<n;j++){ 13 if(map[i][j]){ 14 int tmp=DP(j); 15 if(ans<tmp+1) ans=tmp+1; 16 } 17 } 18 return ans; 19 } 20 int main(){ 21 int i,j; 22 scanf("%d",&T); 23 while(T--){ 24 scanf("%d",&n); 25 for(i=0;i<n;i++){ 26 scanf("%d%d",&a[i],&b[i]); 27 } 28 memset(dp,0,sizeof(dp)); 29 memset(map,0,sizeof(map)); 30 for(i=0;i<n;i++) 31 for(j=0;j<n;j++){ 32 if( (a[i]>a[j]&&b[i]>b[j]) || (a[i]>b[j]&&b[i]>a[j])) 33 map[i][j]=1; 34 } 35 int res=0; 36 for(i=0;i<n;i++){ 37 if(res<DP(i)) res=DP(i); 38 } 39 printf("%d\n",res); 40 } 41 return 0; 42 }
排序:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<stdio.h> 2 #include<math.h> 3 #include<iostream> 4 #include<algorithm> 5 using namespace std; 6 const int N=1005; 7 int dp[N]; 8 int T,n; 9 struct node{ 10 int a,b; 11 }c[N]; 12 int cmp(node c1,node c2){ 13 if(c1.a!=c2.a) return c1.a<c2.a; 14 else return c1.b<c2.b; 15 } 16 int main(){ 17 int i,j; 18 scanf("%d",&T); 19 while(T--){ 20 scanf("%d",&n); 21 if(n==0){puts("0");continue;} 22 for(i=0;i<n;i++){ 23 dp[i]=1; 24 scanf("%d%d",&c[i].a,&c[i].b); 25 if(c[i].a<c[i].b) { 26 int t=c[i].a;c[i].a=c[i].b;c[i].b=t; 27 } 28 /// c[i].a >= c[i].b !!! 29 } 30 int res=1; 31 sort(c,c+n,cmp); 32 for(i=n-2;i>=0;i--){ 33 for(j=i+1;j<n;j++) 34 if(c[i].a<c[j].a&&c[i].b<c[j].b){ 35 dp[i]=max(dp[i],dp[j]+1); 36 } 37 if(res<dp[i]) res=dp[i]; 38 } 39 printf("%d\n",res); 40 } 41 return 0; 42 }