DAG(无回路有向图)的最长路 嵌套矩形

题目:http://acm.nyist.net/JudgeOnline/problem.php?pid=16

思路:d(i)=max{0,d(j)矩形j可以嵌套在矩形i中}+1

记忆化搜索,否则会超时:

View Code
 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 }

排序:

View Code
 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 }

 

posted @ 2013-04-10 21:02  _sunshine  阅读(607)  评论(0编辑  收藏  举报