UVA111 LCS

来源:互联网 发布:王奔宏淘宝店网址 编辑:程序博客网 时间:2024/06/08 18:16

////  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.从父亲序列的收缩的角度考虑



0 0
原创粉丝点击