UVa 103

来源:互联网 发布:rar怎么解压到mac 编辑:程序博客网 时间:2024/04/19 22:59

问题链接:

点击打开链接

解题思路:

根据题目输入的维度,将n维度的盒子按照维度边从小到大排序,再将1到k个盒子进行比较,若一个盒子a排序后的所有维度边相对应另一个盒子b排序后的所有维度边小,则a可以嵌入b中,以此来生成邻接矩阵。使用动态规划法,状态转移方程为 dp(i)=max{dp(j)+1},其中j取1到k。

代码如下:

//动态规划方法#include<cstdio>#include<stdlib.h>#include<cstring>int k;//[1 30]int n;//[1 10]int A[35][15];int flag[35][35];int d[35];int next[35];int dp(int i){    if(d[i]>0)return d[i];    d[i]=1;    next[i]=0;    int cur;    for(int j=1;j<=k;++j)    {        if(flag[i][j]==1)        {            cur=dp(j)+1;            if(cur>d[i])            {                d[i]=cur;                next[i]=j;                }        }    }    return d[i];}//判断a是否可嵌入bint isNest(int* a,int* b){    for(int i=0;i<n;++i)    {        if(a[i]>=b[i])return 0;    }    return 1;}int cmp(const void* a,const void* b){    return *(int*)a-*(int*)b;}int main(){    int a;    while(scanf("%d%d",&k,&n)==2)    {        memset(flag,0,sizeof(flag));        memset(d,0,sizeof(d));        for(int i=1;i<=k;++i)        {            for(int j=0;j<n;++j)scanf("%d",A[i]+j);            qsort(A[i],n,sizeof(A[0][0]),cmp);        }        //生成邻接矩阵        for(int i=1;i<=k;++i)        {            for(int j=1;j<=k;++j)            {                if(i==j)continue;                if(isNest(A[i],A[j]))flag[i][j]=1;            }        }        /*for(int i=1;i<=k;++i)        {            for(int j=1;j<=k;++j)printf("%d ",flag[i][j]);            putchar('\n');        }*/        int max=0,site;        for(int i=1;i<=k;i++)        {            int cur=dp(i);            if(max<cur)            {                max=cur;                site=i;            }        }        printf("%d\n",max);        printf("%d ",site);        int i=site;        while(next[i])        {            i=next[i];            printf("%d ",i);        }        putchar('\n');    }    return 0;}


0 0
原创粉丝点击