UVA 111

又被题意坑了...

输入的一串数字的含义是第i个数字是第a[i]个发生的。而不是编号为i的历史事件的实际发生顺序。所以第一步要做的是转换,将原始数据转换成编号为i的历史事件的实际发生顺序。然后按照实际的发生顺序在aaa数组中给予权值,这是为了方便之后判断学生的答案中两个数字的相对顺序。

#include<stdio.h>
#include<string.h>
int aa[21];//存储初步转换完成后的标准事件顺序
int aaa[21];//存储标准事件顺序的权值,方便以后比较两个数的相对大小
int ttmp[21];//存储转换完成后的考生答案
int dp[21];//记录第i个数之前最长的字串
int main()
{
    int a,tmp,maxx;
    int i,j;
    scanf("%d",&a);
    for(i=1;i<=a;i++)
    {
        scanf("%d",&tmp);
        aa[tmp]=i;
    }
    for(i=1;i<=a;i++)
    {
        aaa[aa[i]]=i;
    }
    while(scanf("%d",&tmp)!=EOF)
    {
        ttmp[tmp]=1;
        for(i=1;i<=a;i++)
        {
            dp[i]=1;
        }
        for(i=2;i<=a;i++)
        {
            scanf("%d",&tmp);
            ttmp[tmp]=i;
        }
        for(i=2;i<=a;i++)
        {
            maxx=0;
            for(j=i;j>=1;j--)
            {
                if(aaa[ttmp[i]]>aaa[ttmp[j]]&&maxx<dp[j])
                {
                    maxx=dp[j];
                    if(dp[j]>=j)
                        break;
                }
            }
            dp[i]+=maxx;
        }
        maxx=0;
        for(i=1;i<=a;i++)
        {
            if(maxx<dp[i])
                maxx=dp[i];
        }
        printf("%d
",maxx);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/tun117/p/4429298.html