ZOJ - 1093 Monkey and Banana

DAG嵌套模型,状态方程由1改成高度就行。

 1 /*简单的DAG矩形嵌套模型,即权值为1*/
 2 #include<stdio.h>
 3 #include<string.h>
 4 #define doumax(a,b) (a>b?a:b)
 5 const int maxn=100;
 6 int mat[maxn][maxn],dp[maxn],n;
 7 struct node{
 8     int a;
 9     int b;
10     void dousort(void)
11     {
12         if(a<b){
13             int temp=a;
14             a=b;
15             b=temp;
16         }
17     }
18     bool operator<(const node & t)
19     {
20         return t.a>a && t.b>b;
21     }
22 }rect[maxn];
23 int dpmodel(int i);
24 int main()
25 {
26     while(scanf("%d",&n)==1){
27         for(int i=1;i<=n;i++){
28             scanf("%d%d",&rect[i].a,&rect[i].b);
29             rect[i].dousort();
30         }
31         memset(mat,0,sizeof(mat));
32         memset(dp,0,sizeof(dp));
33         for(int i=1;i<=n;i++)
34             for(int j=i+1;j<=n;j++){
35                 if(rect[i]<rect[j])
36                     mat[i][j]=1;
37                 else if(rect[j]<rect[i])
38                     mat[j][i]=1;
39             }
40         int maxroad=0;
41         for(int i=1;i<=n;i++){
42             if(maxroad<dpmodel(i))
43                 maxroad=dpmodel(i);
44         }
45         printf("%d\n",maxroad);
46     }
47 }
48 int dpmodel(int i)
49 {
50     if(dp[i]>0)
51         return dp[i];
52     dp[i]=1;
53     for(int j=1;j<=n;j++)
54         if(mat[i][j])
55         dp[i]=doumax(dp[i],dpmodel(j)+1);
56     return dp[i];
57 }

 

 /*本题AC代码*/
1
#include<stdio.h> 2 #include<string.h> 3 #include<algorithm> 4 #define doumax(a,b) (a>b?a:b) 5 const int maxn=100; 6 int mat[maxn][maxn],dp[maxn],n,a[35][5],nodenum; 7 struct node{ 8 int l,w,h; 9 void init(int x,int y,int z) 10 { 11 l=x;w=y;h=z; 12 } 13 bool operator<(const node & temp) 14 { 15 return l<temp.l && w<temp.w; 16 } 17 }block[maxn]; 18 int dpmodel(int i); 19 int main() 20 { 21 int t=1; 22 while(scanf("%d",&n)==1 && n){ 23 nodenum=0; 24 memset(mat,0,sizeof(mat)); 25 memset(dp,0,sizeof(dp)); 26 for(int i=0;i<n;i++){ 27 scanf("%d%d%d",&a[i][0],&a[i][1],&a[i][2]); 28 std::sort(a[i],a[i]+3); 29 for(int j=0;j<2;j++) 30 for(int k=j+1;k<3;k++) 31 block[++nodenum].init(a[i][j],a[i][k],a[i][3-j-k]); 32 } 33 for(int i=1;i<=nodenum;i++) 34 for(int j=i+1;j<=nodenum;j++){ 35 if(block[i]<block[j]) 36 mat[i][j]=1; 37 else if(block[j]<block[i]) 38 mat[j][i]=1; 39 } 40 int maxheight=0; 41 for(int i=1;i<=nodenum;i++){ 42 if(!dp[i]){ 43 int ans=dpmodel(i); 44 if(maxheight<ans) 45 maxheight=ans; 46 } 47 } 48 printf("Case %d: maximum height = %d\n",t++,maxheight); 49 } 50 return 0; 51 } 52 int dpmodel(int i) 53 { 54 if(dp[i]>0) 55 return dp[i]; 56 dp[i]=block[i].h; 57 for(int j=1;j<=nodenum;j++) 58 if(mat[i][j]) 59 dp[i]=doumax(dp[i],dpmodel(j)+block[i].h); 60 return dp[i]; 61 }

posted on 2014-07-18 19:52  BMESwimming  阅读(146)  评论(0编辑  收藏  举报