UVa:103 Stacking Boxes

来源:互联网 发布:工资查询软件 编辑:程序博客网 时间:2024/06/10 03:27

1Y.

做完10131 Is Bigger Smarter?以后才知道是个LIS的题。这个题跟那个很相似。

不多说了。

 

#include <iostream>#include <cstdio>#include <cstring>#include <cmath>#include <algorithm>using namespace std;struct Box{    int num,d[12];};Box p[32];int dp[32];int path[32];int n,k;bool Judge(Box &a,Box &b){    for(int i=0; i<k; ++i)        if(a.d[i]>=b.d[i]) return false;    return true;}bool cmp(Box a,Box b){    int i=0;    while(a.d[i]==b.d[i]&&i<k) i++;    if(i<k) return a.d[i]<b.d[i];    else return a.d[i-1]<b.d[i-1];}int main(){    while(scanf("%d%d",&n,&k)!=EOF)    {        memset(dp,0,sizeof(dp));        memset(path,-1,sizeof(path));        for(int i=1; i<=n; ++i)        {            for(int j=0; j<k; ++j)                scanf("%d",&p[i].d[j]);            sort(p[i].d,p[i].d+k);            p[i].num=i;        }        sort(p+1,p+n+1,cmp);        int mx;        for(int i=n; i>=1; --i)        {            mx=-1;            bool ok=false;            for(int j=i+1; j<=n; ++j)                if(Judge(p[i],p[j])&&dp[j]>mx)                {                    mx=dp[j];                    path[i]=j;                    ok=true;                }            if(ok) dp[i]=1+mx;            else            {                path[i]=0;                dp[i]=1;            }        }        mx=-1;        int key;        for(int i=1; i<=n; ++i)            if(dp[i]>mx)            {                mx=dp[i];                key=i;            }        printf("%d\n",mx);        printf("%d",p[key].num);        key=path[key];        while(key)        {            printf(" %d",p[key].num);            key=path[key];        }        printf("\n");    }    return 0;}


 

原创粉丝点击