uva 437 The Tower of Babylon(dp,记忆化搜索)

来源:互联网 发布:部落冲突兵种数据 编辑:程序博客网 时间:2024/05/13 14:19


垒箱子,保证上面的箱子长宽严格小于下面的箱子,求最大高度

dp[k][t]以第k个箱子为底的最大高度,记忆化搜索

#include<stdio.h>#include<string.h>#define MAXN 35int dp[MAXN][3];int block[MAXN][3];int vis[MAXN],n;bool judge(int i,int a,int j,int b){int ie0=block[i][a],ie1=block[i][(a+1)%3],je0=block[j][b],je1=block[j][(b+1)%3];if(je0<ie0&&je1<ie1||je0<ie1&&je1<ie0) return true;else return false;}int max(int a,int b) {return a>b?a:b;}int dfs(int k,int t){if(dp[k][t]) return dp[k][t];int ans=0;for(int i=0;i<n;i++){if(vis[i]) continue;for(int j=0;j<3;j++){if(judge(k,t,i,j)){ans=max(ans,dfs(i,j)+block[i][(j+2)%3]);}}}dp[k][t]=ans;return ans;}int main(){int cas=1;while(scanf("%d",&n)!=EOF&&n){for(int i=0;i<n;i++)for(int j=0;j<3;j++)scanf("%d",&block[i][j]);memset(dp,0,sizeof(dp));for(int i=0;i<n;i++)for(int j=0;j<3;j++){memset(vis,0,sizeof(vis));dfs(i,j);}int ans=0; for(int i=0;i<n;i++)for(int j=0;j<3;j++){dp[i][j]+=block[i][(j+2)%3];if(dp[i][j]>ans) ans=dp[i][j];}printf("Case %d: maximum height = %d\n",cas++,ans);}return 0;}


0 0
原创粉丝点击