//
// main.cpp
// uva111
//
// Created by 丁宇阳 on 15-6-2.
// Copyright (c) 2015年 丁宇阳. All rights reserved.
//
#include <cstdio>
#include<algorithm>
using namespace std;
int main() {
int len;
scanf("%d",&len);
int A[30],B[30];
for(int i=1;i<=len;i++)
{
int p;
scanf("%d",&p);
A[p]=i;
}
int p;
while(~scanf("%d",&p))
{
B[p]=1;
int d[30][30];
for(int j=2;j<=len;j++)
{
int p;
scanf("%d",&p);
B[p]=j;
}
for(int i=0;i<=len;i++)
d[i][0]=d[0][i]=0;
for(int i=1;i<=len;i++)
{
for(int j=1;j<=len;j++)
{
if(A[i]==B[j])
{
d[i][j]=d[i-1][j-1]+1;
// printf("jia d[%d][%d]=%d\n",i,j,d[i][j]);
}
else
{
d[i][j]=max(d[i-1][j],d[i][j-1]);
//printf("d[%d][%d]=%d\n",i,j,d[i][j]);
}
}
}
printf("%d\n",d[len][len]);
}
return 0;
}
1.首先这题最坑爹的是输入要进行转化,不能直接读取到数组中,他相当于输入1,2,3,4,5。。。。。。的每一个下标
2.这里我采用的是填表法的dp,特点在于相当于给你一张表格,已经有了几个空填上答案了,而且知道规则,要求把所有
的空填满
3.值得注意的是需要初始化的不止0,0和0,1和1,0
4.如果不采用~scanf的读取模式而是while(1)的模式读取B数组,会导致TLE
5.:LCS的转移方程巧妙之处:
1.求最长的公共序列,它并用四重循环A[i]~A[j] B[i']~B[j']
2.从父亲序列的收缩的角度考虑