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 }