Problem: 2050E - Three Strings
Language: java

Solution 1 (runtime: 374 ms):
import java.util.*;

public class Solution {
    static int dp[][];
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int t = sc.nextInt();

        while(t-->0){
            String a=sc.next();
            String b=sc.next();
            String c=sc.next();
            dp=new int[a.length()+1][b.length()+1];

            for(int i=0;i<dp.length;i++){
                Arrays.fill(dp[i],-1);
            }
            System.out.println(solve(a,b,c,0,0,0));

        }
    }
    public static int solve(String a,String b,String c,int i,int j,int k){
        if(i==a.length() || j==b.length()){
            return calc(a,b,c,i,j,k);
        }
        if(dp[i][j]!=-1) return dp[i][j];
        if(c.charAt(k)==a.charAt(i) && c.charAt(k)==b.charAt(j)){
            return dp[i][j]=Math.min(solve(a,b,c,i+1,j,k+1),solve(a,b,c,i,j+1,k+1));

        }
        else if(c.charAt(k)==a.charAt(i) ){
            return dp[i][j]=Math.min(solve(a,b,c,i+1,j,k+1),1+solve(a,b,c,i,j+1,k+1));
        }
        else if(c.charAt(k)==b.charAt(j)){
            return dp[i][j]=Math.min(solve(a,b,c,i,j+1,k+1),1+solve(a,b,c,i+1,j,k+1));
        }
        else return dp[i][j]=1+Math.min(solve(a,b,c,i+1,j,k+1),solve(a,b,c,i,j+1,k+1));
    }

    public static int calc(String a,String b,String c,int i,int j,int k){
        int count=0;
        if(i==a.length()){
            while(j<b.length()){
                if(b.charAt(j)!=c.charAt(k)){
                    count++;
                }
                k++;
                j++;
            }

        }
        else{
            while(i<a.length()){
                if(a.charAt(i)!=c.charAt(k)){
                    count++;
                }
                i++;
                k++;
            }
        }
        return count;
    }
}

Solution 2 (runtime: 296 ms):
//package codeforcesques;
import java.util.*;
import java.io.*;
public class ThreeStrings {
    int mincount = Integer.MAX_VALUE;

    public static void main(String[] args) {
        FastReader fs = new FastReader();

        int t = fs.nextInt();

        while (t-- > 0) {
            String s1 = fs.nextLine();
            String s2 = fs.nextLine();
            String s3 = fs.nextLine();
            ThreeStrings d = new ThreeStrings();
            int[][] dp = new int[s1.length()][s2.length()];
            for (int i = 0; i < s1.length(); i++) {
                Arrays.fill(dp[i], -1);
            }
            System.out.println( s3.length()-rec(0, 0, 0, s1, s2, s3, dp));
        }
    }
    public static int rec(int n, int i, int j, String a, String b, String c, int[][] dp) {
        if (i == a.length()) {
            int val = 0;
            while (j < b.length()) {
                if (b.charAt(j) == c.charAt(n)) {
                    val++;
                }
                j++;
                n++;
            }
            return val;
        }
        if (j == b.length()) {
            int val = 0;
            while (i < a.length()) {
                if (a.charAt(i) == c.charAt(n)) {
                    val++;
                }
                i++;
                n++;
            }
            return val;
        }
        if (dp[i][j] != -1) {
            return dp[i][j];
        }
        int c1 = 0;
        int c2 = 0;
        if (a.charAt(i) == c.charAt(n)) {
            c1++;
        }
        if (b.charAt(j) == c.charAt(n)) {
            c2++;
        }
        int max1 = rec(n + 1, i + 1, j, a, b, c, dp) + c1;
        int max2 = rec(n + 1, i, j + 1, a, b, c, dp) + c2;
        dp[i][j] = Math.max(max1, max2);
        return dp[i][j];
    }
}
class FastReader {
    BufferedReader gt;
    StringTokenizer st;

    public FastReader() {
        gt = new BufferedReader(new InputStreamReader(System.in));
    }

    String next() {
        while (st == null || !st.hasMoreElements()) {
            try {
                st = new StringTokenizer(gt.readLine());
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return st.nextToken();
    }

    String nextLine() {
        String str = "";
        try {
            str = gt.readLine();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return str;
    }

    int nextInt() {
        return Integer.parseInt(next());
    }

    int[] readIntArray(int n) {
        int[] res = new int[n];
        for (int i = 0; i < n; i++)
            res[i] = nextInt();
        return res;
    }

    long nextLong() {
        return Long.parseLong(next());
    }

    long[] readLongArray(int n) {
        long[] res = new long[n];
        for (int i = 0; i < n; i++)
            res[i] = nextLong();
        return res;
    }

    String[] readStringArray(int n) {
        String[] str = new String[n];
        for (int i = 0; i < n; i++)
            str[i] = nextLine();

        return str;
    }

    int getGCD(int a, int b) {
        if (b == 0)
            return a;
        else
            return getGCD(b, a % b);
    }
}