• zoj2432


     1 /*
     2 首先,dp的最开始是定义状态 dp[i][j] 表示A串的前i个,与B串的前j个,并以B[j]为结尾的LCIS 的长度.
     3 状态转移方程:
     4 if(A[i]==B[j]) dp[i][j]=max(dp[i-1][k])+1;  ( 1 <= k < j )
     5 else dp[i][j]=dp[i-1][j];
     6 然后选择循环顺序,就可以将算法的复杂度降为n*n.
     7 转自:http://www.cnblogs.com/chenhuan001/archive/2013/03/26/2982677.html
     8 PS:用一维数组来记录路径老是wa,测了好多组都是对的,从昨晚一直纠结到现在,先mark,以后看,真想砸电脑*/
     9 
    10 #include <stdio.h>
    11 #include <string.h>
    12 #include <iostream>
    13 using namespace std;
    14 #define N 550
    15 struct node
    16 {
    17     int x,y;
    18 }path[N][N];
    19 int dp[N][N];
    20 int s[N],t[N];
    21 
    22 int main()
    23 {
    24     int t1;
    25     while(scanf("%d",&t1)!=EOF)
    26     {
    27         while(t1--)
    28         {
    29             memset(path,0,sizeof(path));
    30             int n,m;
    31             scanf("%d",&n);
    32             for(int i=1;i<=n;i++)
    33                 scanf("%d",&s[i]);
    34             scanf("%d",&m);
    35             for(int i=1;i<=m;i++)
    36                 scanf("%d",&t[i]);
    37             memset(dp,0,sizeof(dp));
    38             int mx=0;
    39             for(int i=1;i<=n;i++)
    40             {
    41                 mx=0;
    42                 int tx=0,ty=0;
    43                 for(int j=1;j<=m;j++)
    44                 {
    45                     dp[i][j] = dp[i-1][j];
    46                     path[i][j].x=i-1;
    47                     path[i][j].y=j;
    48                     if( s[i]>t[j] && mx<dp[i-1][j])
    49                     {
    50                         mx=dp[i-1][j];
    51                         tx=i-1;//修改最长匹配的下标
    52                         ty=j;//修改最长匹配的下标
    53                     }
    54                     if( s[i] == t[j] )
    55                     {
    56                         dp[i][j]=mx+1;
    57                         path[i][j].x=tx;//记录前一个匹配的下标
    58                         path[i][j].y=ty;//记录前一个匹配的下标
    59                     }
    60                 }
    61             }
    62             mx=-1;
    63             int id;
    64             for(int i=1;i<=m;i++) 
    65                 if(dp[n][i]>mx) 
    66                 {
    67                     mx=dp[n][i];
    68                     id=i;
    69                 }
    70             int save[N];
    71             int cnt=0;
    72             int tx,ty;
    73             tx=n; ty=id;
    74             while( dp[tx][ty] != 0 ) 
    75             {
    76                 int tmpx,tmpy;
    77                 tmpx=path[tx][ty].x;
    78                 tmpy=path[tx][ty].y;
    79                 if(dp[tx][ty]!=dp[tmpx][tmpy])
    80                 {
    81                     save[cnt++]=t[ty];
    82                 }
    83                 tx=tmpx; ty=tmpy;
    84             }
    85             printf("%d
    ",mx);
    86             for(int i=cnt-1;i>=0;i--)
    87                 printf("%d ",save[i]);
    88             printf("
    ");
    89         }
    90     }
    91     return 0;
    92 }
  • 相关阅读:
    BGP协议
    OSPF协议项目实战
    理解Eth-Trunk
    二层交换网络当中的高级内容
    策略路由
    isis综合作业
    mac 上安装brew,permission denied解决,安装pip, 安装 requests
    [随笔]swift 笔记
    [转]Swift
    [汇] Android 知识汇总
  • 原文地址:https://www.cnblogs.com/okboy/p/3229569.html
Copyright © 2020-2023  润新知