zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    16进制节码解析
    批注:modbus_tkdefines.py
    <20211019> Win10不明原因丢失任务提示栏里的Wifi以及网络任务提示栏logo
    <20210926>log: 运行5年3个月的NAS硬盘更换
    Huggingface中的BERT模型的使用方法
    list变量和dict变量前面加*号
    Linux服务器登录阿里网盘下载和上传文件的方法
    【IDEA与git集成】
    【为什么要用 @param注解】
    【我的编程习惯与开发插件】
  • 原文地址:https://www.cnblogs.com/okboy/p/3229569.html
Copyright © 2011-2022 走看看