DAG嵌套模型,状态方程由1改成高度就行。
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 }
ZOJ - 1093 Monkey and Banana,布布扣,bubuko.com
原文地址:http://www.cnblogs.com/BMESwimming/p/3854194.html