| 1 | Initialize DP table | - | - | All zeros | [[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]] |
| 2 | Compare X[0]='A' and Y[0]='B' | (1,1) | A vs B | dp[1][1] = max(dp[0][1], dp[1][0]) = 0 | [[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]] |
| 3 | Compare X[0]='A' and Y[1]='D' | (1,2) | A vs D | dp[1][2] = max(dp[0][2], dp[1][1]) = 0 | [[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]] |
| 4 | Compare X[0]='A' and Y[2]='C' | (1,3) | A vs C | dp[1][3] = max(dp[0][3], dp[1][2]) = 0 | [[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]] |
| 5 | Compare X[1]='B' and Y[0]='B' | (2,1) | B vs B | dp[2][1] = dp[1][0] + 1 = 1 | [[0,0,0,0],[0,0,0,0],[0,1,0,0],[0,0,0,0]] |
| 6 | Compare X[1]='B' and Y[1]='D' | (2,2) | B vs D | dp[2][2] = max(dp[1][2], dp[2][1]) = 1 | [[0,0,0,0],[0,0,0,0],[0,1,1,0],[0,0,0,0]] |
| 7 | Compare X[1]='B' and Y[2]='C' | (2,3) | B vs C | dp[2][3] = max(dp[1][3], dp[2][2]) = 1 | [[0,0,0,0],[0,0,0,0],[0,1,1,1],[0,0,0,0]] |
| 8 | Compare X[2]='C' and Y[0]='B' | (3,1) | C vs B | dp[3][1] = max(dp[2][1], dp[3][0]) = 1 | [[0,0,0,0],[0,0,0,0],[0,1,1,1],[0,1,0,0]] |
| 9 | Compare X[2]='C' and Y[1]='D' | (3,2) | C vs D | dp[3][2] = max(dp[2][2], dp[3][1]) = 1 | [[0,0,0,0],[0,0,0,0],[0,1,1,1],[0,1,1,0]] |
| 10 | Compare X[2]='C' and Y[2]='C' | (3,3) | C vs C | dp[3][3] = dp[2][2] + 1 = 2 | [[0,0,0,0],[0,0,0,0],[0,1,1,1],[0,1,1,2]] |
| 11 | Traceback start | (3,3) | - | Start at dp[3][3]=2 | - |
| 12 | X[2]=C equals Y[2]=C | (3,3) | C vs C | Add 'C' to result, move i=2, j=2 | - |
| 13 | X[1]=B vs Y[1]=D | (2,2) | B vs D | dp[1][2]=0 < dp[2][1]=1, move i=2, j=1 | - |
| 14 | X[1]=B equals Y[0]=B | (2,1) | B vs B | Add 'B' to result, move i=1, j=0 | - |
| 15 | Traceback ends | (1,0) | - | j=0 reached, stop | - |