dp+记忆化搜索
主要是将一个砖块的不同摆放方式,转化为6种不同的砖块,按同一方式摆放,这就将一个3维问题转化成为了一个1维问题。同一底面的砖块只构造了一次,DFS时直放横放都判断一次就可以了。dp[i]表示以i砖块作为第一块底砖能够达到的最大高度,所以结果自然为DP[0];
#include<stdio.h>
#include<string.h>
#define max(a,b)((a)>(b)?(a):(b))
int cas,n,a,b,c,j;
int num[100][3];
int dp[100];
int dfs(int i)
{
if(dp[i]!=-1&&i!=0) return dp[i];
if(i!=0) dp[i]=num[i][2];
for(int k=1;k<=j;k++)
{
if((num[k][0]<num[i][0]&&num[k][1]<num[i][1])||(num[k][0]<num[i][1]&&num[k][1]<num[i][0]))
{
dp[i]=max(dp[i],dfs(k)+num[i][2]);
}
}
return dp[i];
}
int main()
{
cas=0;
while(scanf("%d",&n)&&n)
{
j=0;
cas++;
for(int i=1;i<=n;i++)
{
scanf("%d%d%d",&a,&b,&c);
num[++j][0]=a;
num[j][1]=b;
num[j][2]=c;
num[++j][0]=b;
num[j][1]=c;
num[j][2]=a;
num[++j][0]=a;
num[j][1]=c;
num[j][2]=b;
}
num[0][0]=num[0][1]=9999999;
num[0][2]=0;
memset(dp,-1,sizeof(dp));
dp[0]=0;
//printf("%d\n",j);
printf("Case %d: maximum height = %d\n",cas,dfs(0));
}
return 0;
}
hdu 1069 Monkey and Banana
最新推荐文章于 2018-11-18 09:16:15 发布