Go: package main

import (
	"bufio"
	"os"
	"io"
	"strconv"
	"math"
	"fmt"
)

var (
	nstr   func() string
	stdout *bufio.Writer
)

func init() {
	nstr = newReadString(os.Stdin)
	stdout = bufio.NewWriter(os.Stdout)
}

func main() {
	defer stdout.Flush()

	n := nint()
	xList := make([]string, n)
	yList := make([]string, n)

	for i:=0;i<n ;i++  {
		xList[i] = nstr()
		yList[i] = nstr()
	}

	for i := 0; i<n	; i++  {
		fmt.Println(lcs(xList[i], yList[i]))
	}

}

func lcs(x string, y string) int{
	var m = len(x)
	var n = len(y)

	c := make([][]int, m+1)
	for i:= range c{
		c[i] = make([]int, n+1)
	}
	for i:=	1;i<=m ;i++  {
		for j:=1;j<=n ;j++  {
			if x[i-1] == y[j-1]{
				c[i][j] = c[i-1][j-1] + 1
			}else{
				c[i][j] = int(math.Max(float64(c[i-1][j]), float64(c[i][j-1])))
			}


		}
	}
	return c[m][n]

}


func newReadString(ior io.Reader) func() string {
	r := bufio.NewScanner(ior)
	r.Buffer(make([]byte, 1024), int(1e+11))
	r.Split(bufio.ScanWords)

	return func() string {
		if !r.Scan() {
			panic("Scan failed")
		}
		return r.Text()
	}
}

func nint64() int64 {
	i, err := strconv.ParseInt(nstr(), 0, 64)
	if err != nil {
		panic(err.Error())
	}
	return i
}

func nint() int {
	return int(nint64())
}

func getIntSlice(n int) []int {
	b := make([]int, n)
	for i := 0; i < n; i++ {
		b[i] = nint()
	}
	return b
}

func getStringSlice(n int) []string {
	b := make([]string, n)
	for i := 0; i < n; i++ {
		b[i] = nstr()
	}
	return b
}

func gcd(x, y int) int {
	if y == 0 {
		return x
	}
	return gcd(y, x%y)
}

func lcm(x, y int) int {
	return x * y / gcd(x, y)
}

func contains(s []int, e int) bool {
	for _, a := range s {
		if a == e {
			return true
		}
	}
	return false
}

func bin(i int, prefix bool) string {
	i64 := int64(i)

	if prefix {
		return "0b" + strconv.FormatInt(i64, 2)
	} else {
		return strconv.FormatInt(i64, 2)
	}
}

func strReverse(s string) string {
	runes := []rune(s)
	for i, j := 0, len(runes)-1; i < j; i, j = i+1, j-1 {
		runes[i], runes[j] = runes[j], runes[i]
	}

	return string(runes)
}

C++: #include<bits/stdc++.h>
using namespace std;

int lcs(string s, string t) {
  int n = s.size(), m = t.size();
  vector<vector<int>> dp(n + 1, vector<int>(m + 1, 0));
  for (int i = 0; i < n; i++)
    for (int j = 0; j < m; j++) {
      dp[i + 1][j + 1] =
          max(dp[i][j] + (s[i] == t[j]), max(dp[i][j + 1], dp[i + 1][j]));
    }
  return dp[n][m];
}

int main(void){
    int n;cin>>n;
    for(int i=0;i<n;i++){
        string s,t;cin>>s>>t;
        cout<<lcs(s,t)<<endl;
    }
    return 0;
}

C++: #include <cstdio>
#include <cstring>
#include <algorithm>

int count(int (*common)[1001], char *x, char *y, int n1, int n2){
    if(n1*n2==0)return 0;
    else if(common[n1][n2]<0){
        if(x[n1]==y[n2])common[n1][n2] = 1 + count(common,x,y,n1-1,n2-1);
        else common[n1][n2] = std::max(count(common,x,y,n1-1,n2),count(common,x,y,n1,n2-1));
    }
    return common[n1][n2];
}

int main(){
    int i, j, k, q;
    char c;
    char x[1002], y[1002];
    int common[1001][1001];
    scanf("%d",&q);
    for(i=0;i<q;i++){
        scanf("%s",x+1);
        scanf("%s",y+1);
        int n1 = strlen(x+1);
        int n2 = strlen(y+1);
        for(j=1;j<=n1;j++){
            for(k=1;k<=n2;k++){
                common[j][k] = -1;
            }
        }
        printf("%d\n",count(common,x,y,n1,n2));
    }
    return 0;
}

C++: #include <iostream>

using namespace std;

/**
 *  lcs(m,n) = 
 *  if x[m] == y[n] lcs[m-1,n-1]+1
 *  max(lcs[m-1,n],lcs[m,n-1])
 *
 */

string x, y;

int lcs(int m, int n)
{
	if (m == -1 || n== -1) return 0;
	if (x[m] == y[n]) return lcs(m-1,n-1) + 1;
	int xx = lcs(m-1,n);
	int yy = lcs(m,n-1);
	return xx > yy ? xx : yy;
}

int main()
{
	int n = 0;
	x.resize(150);
	y.resize(150);
	cin >> n; 
	for (int i=0;i<n;i++)
	{
		cin >> x;
		cin >> y;
		cout << lcs(x.size()-1, y.size()-1) << endl;
		x.clear();
		y.clear();
	}
}

C++: #include<iostream>
#include<algorithm>
#include<string>
using namespace std;
int main()
{
	int n, m, q, A[1001][1001], i, j;
	string str1, str2;
	cin >> q;

	while (q--)
	{
		cin >> str1 >> str2;
		n = str1.size();
		m = str2.size();
		int maxv = 0;

		for (i = 1; i <= n; i++)A[i][0] = 0;
		for (i = 1; i <= m; i++)A[0][i] = 0;

		for(i=1;i<=n;i++)
			for (j = 1; j <= m; j++)
			{
				if (str1[i-1] == str2[j-1])
					A[i][j] = A[i - 1][j - 1] + 1;
				else A[i][j] = max(A[i - 1][j], A[i][j - 1]);
			}
		cout << A[n][m] << endl;
	}
	return 0;
}

C++: #include <iostream>
#include <algorithm>
using namespace std;

int lcs( string X , string Y) {
int c[ N + 1 ][ N + 1 ] ; 
int m = X.size() ; 
int n = Y.size() ; 
int max1 = 0 ;
X = ' ' + X ;
Y = ' ' + Y ;

  for(int i = 1 ; i <= m ; i++) c[i][0] = 0 ;
  
  for(int j = 1 ; j <= n ; j++) c[0][j] = 0 ;

  for(int i = 1 ; i <= m ; i++) {
    for(int j = 1; j <= n; j++){
      if (X[i] == Y[j]) {
         c[i][j]=c[i -1][j - 1] + 1;
?????????}

      else {
         c[i][j] = max(c[i - 1][j], c[i][j - 1]);
       }
       max1 = max(max1, c[i][j] ) ;
     }
   }
 return max1 ;
}

int main(){
  string s1 , s2 ;
  int n ; cin >> n ;
  for ( int i = 0 ; i < n ; i++ ) {
      cin >> s1 >> s2 ;
 
      cout<<lcs(s1 , s2) << endl ;
  }
  
  return 0 ;
}

C++: #include <iostream>
#include <string>
using namespace std;
static const int MAX = 1001;
 
void lcs(string X, string Y) {
    int dp[MAX][MAX];  
    int i,j;
 
    int xLength = X.size();
    int yLength = Y.size();
 
 
    // initialize dp[][]
    for (i = 1; i <= xLength; i++)
        dp[i][0] = 0;
    for (i = 1; i <= yLength; i++)
        dp[0][i] = 0;
 
    for (i = 1; i <= xLength; i++){
        for (j = 1; j <= yLength; j++){
            // Because the original string is 0-based , so subtracted from 1
            if (X[i - 1] == Y[j - 1]) {
                dp[i][j] = dp[i-1][j-1] + 1;
            }else {
                dp[i][j] = max(dp[i-1][j], dp[i][j-1]);
            }
        }
    }
 
    // testing code: print out the dp[][]
    // cout << "j";
    // for (j = 1; j <= yLength; j++)
    //  cout << ' ' << j ;
    // cout << endl;
         
 
    // for (i = 1; i <= xLength; i++){
    //  cout << i << '.';
    //  for (j = 1; j <= yLength; j++){
    //      cout << dp[i][j] << ' ';
    //  }
    //  cout << endl;
    // }
 
    cout << dp[xLength][yLength] << endl;
}
 
int main() {
    int n , i;
    string X, Y;
 
    cin >> n;
    for (i = 0 ; i < n; i++ ) {
        cin >> X;
        cin >> Y;
        lcs(X, Y);
    }
 
    return 0;
 
}

C++: #include<iostream>
#include<string>
#include<algoritm>
using namespace std;
static const int N = 1000;
int lcs(string X,string Y){
  int c[N+1][N+1];
  int m = X.size();
  int n = Y.size();
  int maxl = 0;
  X = ' ' + X;
  Y = ' ' + Y;
  for(int i = 1;i<=m;i++) c[i][0] = 0;
  for(int j = 1; j<=n;j++) c[0][j] = 0;

  for(int i = 1; i<= m; i++){
    for(int j = 1; j <= n; j++){
      if(X[i] == Y[j]){
	c[i][j] = c[i-1][j-1]+1;
      }else{
	c[i][j] = max(c[i-1][j],c[i][j-1]);
      }
      maxl = max(maxl,c[i][j]);
    }
  }
  return maxl;
}

int main(){
  string s1,s2;
  int n;
  cin>>n;
  for(int i = 0; i<n;i++){
    cin>>s1>>s2;
    cout<<lcs(s1,s2)<<endl;
  }
  return 0;
}

C++: //
#if 0

#endif // 0
#include<iostream>
#define MAX 1010
using namespace std;
int l[MAX][MAX];

int main()
{
    int num;
    cin>>num;       // int l[MAX][MAX];

    for(int i=0;i<num;i++)
    {
        string s1,s2;
        cin>>s1>>s2;
        //int l[MAX][MAX];
        for(int m=0;m<=s1.size();m++)
            for(int n=0;n<=s2.size();n++)
            {
                if(m<=0||n<=0)
                    l[m][n]=0;
                else if(s1[m-1]==s2[n-1])
                    l[m][n]=l[m-1][n-1]+1;
                else
                    l[m][n]=max(l[m][n-1],l[m-1][n]);
            }
        cout<<l[s1.size()][s2.size()]<<endl;
    }
    return 0;
}