《动态规划》hdoj 1069 最长递减子序列 qsort结构体

输出里面的maximum 写成了maxinum WA了N次 看了N久才发现 !!!!!!!!!!!!!!惨烈!!!!!!!!!!!!!!!!!!!!!!!下次注意!!!!!!!!!!!!!!!!

先讲1个格子拆成3种格子

然后按x对格子进行递减排序

dp[j]记录取第j个格子的情况下 所能堆叠的最大高度

#include<stdio.h>

#include<stdlib.h>
typedef struct
{
    int x;
    int y;
    int z;
}dot;
int cmp(const void*a,const void *b)
{
    return (*(dot *)b).x-(*(dot *)a).x;
}
int main()
{
    dot block[205];
    int n,i,j,max,t,q,w,e,num=0;
    int dp[205];
    while(~scanf("%d",&n),n)
    {
        num++;
        memset(dp,0,sizeof(dp));
        block[0].x=block[0].y=block[0].z=0;
        for(i=1;i<=n;i++)
        {
            scanf("%d%d%d",&q,&w,&e);
            if(q<w)
            {
                t=q;
                q=w;
                w=t;
            }
            if(w<e)
            {
                t=w;
                w=e;
                e=t;
            }
            if(q<w)
            {
                t=q;
                q=w;
                w=t;
            }
            block[i*3-2].x=q;block[i*3-2].y=w;block[i*3-2].z=e;
            block[i*3-1].x=q;block[i*3-1].y=e;block[i*3-1].z=w;
            block[i*3].x=w;block[i*3].y=e;block[i*3].z=q;
        }
        n=n*3;
        qsort(block,n+1,sizeof(dot),cmp);
        for(i=0;i<n;i++)
        {
            dp[i]=block[i].z;
            max=0;
            for(j=0;j<i;j++)
            {
                if(block[i].y<block[j].y&&dp[j]>max&&block[i].x!=block[j].x)
                    max=dp[j];
            }
            dp[i]+=max;
        }
        max=0;
        for(i=0;i<n;i++)
            if(dp[i]>max) max=dp[i];
        printf("Case %d: maximum height = %d\n",num,max);
    }
    return 0;
}

你可能感兴趣的:(《动态规划》hdoj 1069 最长递减子序列 qsort结构体)