hdu 1069 记忆化搜索
自己脑子不灵活,感觉哪根线都与DP接不上轨。。。。。好吧,我先学搜索,接触记忆化,再回来膜拜DP了
多谢PORKer的纠错,自己太粗心了,连个排序也错。。。。谢谢他长期以来的纠错
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct node
{
int a,b,h;
}data[200];
int hash[200];
int cmp(const void*a,const void*b)
{
struct node *p1,*p2;
p1=(struct node*)a;
p2=(struct node*)b;
if(p1->a!=p2->a)
return p2->a-p1->a;
else return p2->b-p1->b;
}
int n,temp;
void getdata();
int dfs(int,int ,int);
int main()
{
/* freopen("output.txt","w",stdout);*/
int max=0,t=0;
while(scanf("%d",&n)&&n)
{
memset(hash,0,sizeof(hash));
getdata();
qsort(data,n*6,sizeof(data[0]),cmp);
max=dfs(0,0x7FFFFFFF,0x7FFFFFFF);
printf("Case %d: maximum height = %d\n",++t,max);
}
return 0;
}
int dfs(int start,int nowa,int nowb)
{
int i,max=0,k;
if(start>=n*6) return 0;
if(hash[start])
return hash[start];
for(i=start;i<n*6;i++)
{
if(data[i].a<nowa&&data[i].b<nowb)
{
k=data[i].h+dfs(i+1,data[i].a,data[i].b);
if(k>max) max=k;
}
}
hash[start]=max;
/* printf("start:%d (%d,%d) max:%d\n",start,nowa,nowb,max);*/
return max;
}
void getdata()
{
int i,a,b,h;
temp=0;
for(i=0;i<n;i++)
{
scanf("%d %d %d",&a,&b,&h);
data[temp].a=a;
data[temp].b=b;
data[temp].h=h;
temp++;
data[temp].a=b;
data[temp].b=a;
data[temp].h=h;
temp++;
data[temp].a=a;
data[temp].b=h;
data[temp].h=b;
temp++;
data[temp].a=h;
data[temp].b=a;
data[temp].h=b;
temp++;
data[temp].a=h;
data[temp].b=b;
data[temp].h=a;
temp++;
data[temp].a=b;
data[temp].b=h;
data[temp].h=a;
temp++;
}
}
浙公网安备 33010602011771号