梦,才是最真的现实

导航

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++;
    }
}


posted on 2012-06-09 14:03  梦,才是最真的现实  阅读(141)  评论(0编辑  收藏  举报