动态规划之最长公共子序列问题 c语言实现

/b说明,当为0时方向为左上角,为1时方向为左为2时方向为上
void LCS(char* x,char* y,int lenx,int leny,int c[][100],int b[][100]){
    for(int i=1;i<=leny;i++){
       c[0][i] = 0;
    }
    for(int i=0;i<=lenx;i++){
       c[i][0] = 0;
    }
    for(int i=1;i<=lenx;i++){
        for(int j=1;j<=leny;j++){
            if(x[i-1]==y[j-1]){
              c[i][j] = c[i-1][j-1]+1;
              b[i][j] = 0;
            }else{
                if(c[i-1][j]>=c[i][j-1]){
                   c[i][j] = c[i-1][j];
                   b[i][j] = 2;
                }else{
                   c[i][j] = c[i][j-1];
                   b[i][j] = 1;
                }
            }
        }
    }
}
int clcsp[100][2];
int tlcs = 0;
void countLCSp(int b[][100],int i,int j){
    if(i!=0&&j!=0){
        if(b[i][j]==0){
            clcsp[tlcs][0] = i;
            clcsp[tlcs][1] = j;
            tlcs++;
            countLCSp(b,i-1,j-1);
        }else if(b[i][j]==1){
            clcsp[tlcs][0] = i;
            clcsp[tlcs][1] = j;
            tlcs++;
            countLCSp(b,i,j-1);
        }else if(b[i][j]==2){
            clcsp[tlcs][0] = i;
            clcsp[tlcs][1] = j;
            tlcs++;
            countLCSp(b,i-1,j);
        }
    }
}
void printTableLCS(int c[][100],int b[][100],int lenx,int leny){
    countLCSp(b,lenx,leny);
    tlcs--;
    printf("打印表格\n");
    for(int i=0;i     printf("---------");
    printf("\n");
    for(int i=0;i<=lenx;i++){
        for(int j=0;j<=leny;j++){
            if(clcsp[tlcs][0]==i&&clcsp[tlcs][1]==j){
                SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_RED|FOREGROUND_INTENSITY);
                tlcs--;
            }
            if(i!=0&&j!=0){
               switch (b[i][j])
               {
               case 0:
                   printf("↖ ");
                   break;
               case 1:
                    printf("← ");
                   break;
               case 2:
                    printf("↑ ");
                   break;
               default:
                   break;
               }
           }
           printf("%d\t",c[i][j]);
           SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY);  
           printf("|");
        }
        printf("\n");
        for(int i=0;i              printf("---------");
        printf("\n");
    }
}

效果图如下:

动态规划之最长公共子序列问题 c语言实现_第1张图片

你可能感兴趣的:(动态规划之最长公共子序列问题 c语言实现)