HDU 4001

来源:互联网 发布:话剧暗恋桃花源知乎 编辑:程序博客网 时间:2024/05/20 13:08

题目:http://acm.hdu.edu.cn/showproblem.php?pid=4001


思路很简单,就是转化成最长上升子序列,但是各种细节错误,导致了一直不能AC。。= =!!

尤其是在求面积的时候, __int64 s=a*b;   如果a,b为int类型的一定要对a或b进行强制转化,不然会越界的!!

应该写成__int64 s=(__int64 )a*b。


下面是AC代码:

#include<iostream>using namespace std;struct node{    int a,b,c,d;    __int64 s;}block[1010];__int64 dp[1010];int cmp(const void *a,const void *b){    node *p1=(node *)a; node *p2=(node *)b;    if(p1->a!=p2->a)          return p1->a > p2->a?1:-1;    if(p1->b!=p2->b)        return p1->b > p2->b?1:-1;    return p1->d > p2->d ?1:-1;}int main(){    int n,i,j,t;    while(cin>>n&&n>0){        for(i=0;i<=1000;i++)            dp[i]=0;        for(i=0;i<n;i++){            cin>>block[i].a>>block[i].b>>block[i].c>>block[i].d;            if(block[i].a<block[i].b){                t=block[i].a;                block[i].a=block[i].b;                block[i].b=t;            }            block[i].s=(__int64)block[i].a*block[i].b;       //没有对乘数进行强制转化,导致错了N次!!!!        }        qsort(block,n,sizeof(block[0]),cmp);    //    for(i=0;i<n;i++)    //        cout<<block[i].a<<" "<<block[i].b<<endl;        dp[0]=block[0].c;        for(i=1;i<n;i++){            dp[i]=block[i].c;            for(j=0;j<i;j++){                                if(block[i].d==0){                    if(block[i].b>=block[j].b&&block[i].a>=block[j].a){                        if(dp[i]<dp[j]+block[i].c)                        dp[i]=dp[j]+block[i].c;                    }                }                else if(block[i].d==1){                    if(block[i].b>=block[j].b&&block[i].a>=block[j].a&&block[i].s>block[j].s)                            if(dp[i]<dp[j]+block[i].c)                        dp[i]=dp[j]+block[i].c;                }                else if(block[i].d==2){                        if(block[i].a>block[j].a&&block[i].b>block[j].b){                        if(dp[i]<dp[j]+block[i].c)                        dp[i]=dp[j]+block[i].c;                    }                }            }        }        __int64 ans = dp[0];         for(i=1;i<n;i++)            if(ans<dp[i])                ans=dp[i];        printf("%I64d\n",ans);    }    return 0;}