Cod sursa(job #523445)

Utilizator mih15cMihai Cirlanaru mih15c Data 18 ianuarie 2011 04:57:31
Problema Cel mai lung subsir comun Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 2.42 kb
/**
 * 001 Cel mai lung subsir comun (LCS)
 * -----------------------------------
 * Mihai Cirlanaru
*/

#include <stdio.h>
#include <stdlib.h>

int max (int a, int b) {
  if (a < b) return b;
  return a;
}

void fprintLCS (FILE* f, int** C, int* A, int* B, int i, int j) {
  if (i == 0 || j == 0) {
  
  } else {
    if (A[i] == B[j]) {
      fprintLCS (f, C, A, B, i-1, j-1);
      fprintf(f, "%d ", A[i]);
    } else {
      if (C[i][j-1] > C[i-1][j])
	fprintLCS(f, C, A, B, i, j-1);
      else
	fprintLCS(f, C, A, B, i-1, j);
    }
  }
}

int main () {
  int M, N;
  int *A, *B, **suffix, i, j, maxLength = 0;
  
  FILE *in, *out;
  in = fopen("cmlsc.in", "r");
  if (!in) {
    fprintf(stderr, "Error opening input file!\n");
    return 1;
  }
  
  out = fopen("cmlsc.out", "w");
  if (!out) {
    fprintf(stderr, "Error opening output file!\n");
    return 1;
  }
  
  fscanf(in, "%d %d", &M, &N);
  
  A = (int*)malloc((M+1)*sizeof(int));
  if (!A) {
    fprintf(stderr, "Error Allocating memory!\n");
    return 1;
  }
  
  B = (int*)malloc((N+1)*sizeof(int));
  if (!B) {
    fprintf(stderr, "Error Allocating memory!\n");
    return 1;
  }
  
  suffix = (int **)malloc((M+1)*sizeof(int *));
  if (!suffix) {
    fprintf(stderr, "Error Allocating memory!\n");
    return 1;
  }
  
  for (i = 0; i <= M; i++) {
    suffix[i] = (int *)malloc((N+1)*sizeof(int));
    if(!suffix[i]) {
      fprintf(stderr, "Error Allocating memory!\n");
      return 1;
    }
    
    for (j = 0; j <= N; j++)
      suffix[i][j] = 0;
  }
  
  for (i = 1; i <= M; i++)
    fscanf(in, "%d", &A[i]);
  
  for (i = 1; i <= N; i++)
    fscanf(in, "%d", &B[i]);
  
  /* Longest Common Subsequence Algorithm */
  
  for (i = 0; i <= M; i++)
    suffix[i][0] = 0;
  
  for (i = 0; i <= N; i++)
    suffix[0][i] = 0;
    
  for (i = 1; i <= M; i++)
    for (j = 1; j <= N; j++)
      if (A[i] == B[j]) {
	suffix[i][j] = suffix[i-1][j-1] + 1;
      } else {
	suffix[i][j] = max(suffix[i][j-1], suffix[i-1][j]);
      }
  
  maxLength = suffix[M][N];
  fprintf(out, "%d\n", maxLength);
  
  /*/
  printf("Max: %d\n", maxLength);
  
  for (i = 0; i <= M; i++) {
    for (j = 0; j <= N; j++)
      printf("%d ", suffix[i][j]);
    printf("\n");
  }
  //*/
  fprintLCS(out, suffix, A, B, M, N);
  fprintf(out, "\n");
  
  /* Free the memory */
  for (i = 0; i <= M; i++)
    free(suffix[i]);
  
  free(suffix);
  free(A);
  free(B);
  /* Close the files */
  fclose(in);
  fclose(out);
  return 0;
}