Thursday, 27 July 2017

Lightoj 1013 - Love Calculator

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. typedef long long int i64;
  4. typedef unsigned int u32;
  5. typedef unsigned long long int u64;
  6. #define MX 35
  7. char A[MX], B[MX];
  8. int m, n;
  9. int lcss[MX][MX];
  10. i64 num[MX][MX];
  11.  
  12. void computeLCSS(){
  13.     for(int i = 0; i <= m; i++)
  14.         lcss[i][0] = i;
  15.     for(int i = 0; i <= n; i++)
  16.         lcss[0][i] = i;
  17.     for(int i = 1; i <= m; i++)
  18.         for(int j = 1; j <= n; j++){
  19.             if(A[i-1] == B[j-1]) lcss[i][j] = lcss[i-1][j-1];
  20.             else lcss[i][j] = min(lcss[i][j-1], lcss[i-1][j]);
  21.             lcss[i][j]++;
  22.         }
  23. }
  24. void computeWays(){
  25.     for(int i = 0; i <= m; i++)
  26.         num[i][0] = 1;
  27.     for(int j = 0; j <= n; j++)
  28.         num[0][j] = 1;
  29.     for(int i = 1; i <= m; i++)
  30.         for(int j = 1; j <= n; j++){
  31.             if( A[i-1] == B[j-1]) num[i][j] = num[i-1][j-1];
  32.             else if(lcss[i][j-1] < lcss[i-1][j])
  33.                 num[i][j] = num[i][j-1];
  34.             else if(lcss[i][j-1] > lcss[i-1][j])
  35.                     num[i][j] = num[i-1][j];
  36.             else num[i][j] = num[i][j-1] + num[i-1][j];
  37.         }
  38. }
  39. int main(){
  40.  
  41.     int test, cs  = 1;
  42.     scanf("%d"&test);
  43.     while( test-- ){
  44.         scanf("%s", A);
  45.         scanf("%s", B);
  46.         m  = strlen(A);
  47.         n = strlen(B);
  48.         computeLCSS();
  49.         computeWays();
  50.         printf("Case %d: %d %lld\n", cs++, lcss[m][n], num[m][n]);
  51.  
  52.     }
  53.  
  54.     return 0;
  55. }

No comments:

Post a Comment

Most Featured Post

Lightoj 1159 - Batman

http://lightoj.com/volume_showproblem.php?problem=1159 problem analysis: First i thought of this as if s1, s2 and s3 are those three str...