又被题意坑了...
输入的一串数字的含义是第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\n",maxx); } return 0; }
时间: 2024-10-07 20:41:21