uva10131 Is Bigger Smarter?

来源:互联网 发布:知乎大神 编辑:程序博客网 时间:2024/05/25 16:38

一开始以为是LIS,再后来想到其实是DAG最长路,每一个大象都看成是一个节点,大象a和b,如果a的体重小于b,而iq大于b,则节点a到节点b有一条路径长度为1的路,只要找最长路就行了。

#include <iostream>#include <cstdio>#include <algorithm>#include <cstring>using namespace std;const int maxn=1001;const int inf=1000000;int g[maxn][maxn],d[maxn],next[maxn];typedef struct elephant{    int num,weight,iq;}enode;bool cmp(enode x,enode y){    if(x.weight!=y.weight) return x.weight<y.weight;    if(x.iq!=y.iq) return x.iq>y.iq;    return x.num<y.num;}enode node[maxn];int main(){//    freopen("in.txt","r",stdin);    int n=1;    while(scanf("%d%d",&node[n].weight,&node[n].iq)!=EOF)    {        node[n].num=n;//记录没有排序前的真实大象序列号        n++;    }    n--;    sort(node+1,node+n+1,cmp);//按体重递增,iq递减排序    memset(g,0,sizeof(g));    for(int i=1;i<n;i++)        for(int j=i+1;j<=n;j++)            if((node[i].weight<node[j].weight)&&(node[i].iq>node[j].iq))                            g[i][j]=1;    for(int i=1;i<=n;i++)        d[i]=1;//一个大象本身自己的长度为1    memset(next,-1,sizeof(next));    for(int i=n;i>=1;i--)        for(int j=i+1;j<=n;j++)            if(g[i][j])            {                if(d[i]<d[j]+1)                {                    d[i]=d[j]+1;                    next[i]=j;//记录大象i的下一个节点j,方便后面打印路径                }            }        int maxnum=0,pos=-1;    for(int i=1;i<=n;i++)        if(d[i]>maxnum)        {            pos=i;            maxnum=d[i];        }    printf("%d\n",maxnum);    for(int i=pos;i!=-1;i=next[i])    {        printf("%d\n",node[i].num);    }    return 0;}


原创粉丝点击