lcs连续

来源:互联网 发布:教育软件代理 编辑:程序博客网 时间:2024/04/30 09:05

一个序列 S ,如果分别是两个或多个已知序列的子序列,且是所有符合此条件序列中最长的,则 S 称为已知序列的最长公共子序列。

转移方程:

dp[i,j] = 0                                          i=0 || j=0

dp[i,j] = dp[i-1][j-1]+1                        i>0,j>0, a[i] = b[j]       

dp[i,j] = max(dp[i-1][j],dp[i][j-1])        i>0,j>0, a[i] != b[j]

[cpp] view plaincopy
  1. #include "stdio.h"  
  2. #define M 8  
  3. #define N 6  
  4.   
  5.           
  6. void printLSC(int i, int j,char *a, int status[][N]){  
  7.     if(i == 0 || j== 0)  
  8.         return;  
  9.     if(status[i][j] == 0){  
  10.         printLSC(i-1,j-1,a,status);  
  11.         printf("%c",a[i]);  
  12.     }else{  
  13.         if(status[i][j] == 1)  
  14.             printLSC(i-1,j,a,status);  
  15.         else  
  16.             printLSC(i,j-1,a,status);  
  17.     }  
  18. }  
  19. main(){  
  20.     int i,j;  
  21.   
  22.     char a[] = {' ','A','B','C','B','D','A','B'};  
  23.     char b[] = {' ','B','D','C','B','A'};  
  24.     int status[M][N]; //保存状态  
  25.     int dp[M][N];  
  26.   
  27.     for(i = 0; i < M; i++)  
  28.         for(j = 0; j < N; j++){  
  29.             dp[i][j] = 0;  
  30.             status[i][j] = 0;  
  31.         }  
  32.               
  33.     for(i = 1; i < M; i++)  
  34.         for(j = 1; j < N; j++){  
  35.             if(a[i] == b[j]){  
  36.                 dp[i][j] = dp[i-1][j-1] + 1;  
  37.                 status[i][j] = 0;  
  38.             }  
  39.             else if(dp[i][j-1] >= dp[i-1][j]){  
  40.                 dp[i][j] = dp[i][j-1];  
  41.                 status[i][j] = 2;  
  42.             }  
  43.             else{  
  44.                 dp[i][j] = dp[i-1][j];  
  45.                 status[i][j] = 1;  
  46.             }  
  47.                   
  48.                   
  49.         }  
  50.     printf("最大长度:%d",dp[M-1][N-1]);  
  51.     printf("\n");  
  52.     printLSC(M-1,N-1,a,status);  
  53.     printf("\n");  
  54.   
  55. }  
0 0
原创粉丝点击