Thinking
Tips : We will traverse both of two strings, if s1[i] != s2[j], we must delete one of them to minimize the ASCII.State : dp[i][j] denotes the minimum ASCII from the beginning to s1[i] and s2[j].Transformation equation : if s1[i] != s2[j] dp[i][j] = min(dp[i-1][j] + s1[i], dp[i][j-1] + s2[j]), otherwise dp[i][j] = dp[i-1][j-1]
i \ j 0 1 2 3 0 0 s2[0].ASCII s2[0].ASCII + s2[1].ASCII s2[0].ASCII + s2[1].ASCII + s2[2].ASCII 1 s1[0].ASCII 2 s1[1].ASCII + s1[0].ASCII 3 s1[2].ASCII + s1[1].ASCII + s1[0].ASCII
Code
int minimumDeleteSum(string s1, string s2) {
int l1 = s1.length()+1, l2 = s2.length()+1;
vector< vector<int> > dp(l1, vector<int>(l2, 0));
for (int i=1; i<l1; i++) {
dp[i][0] = s1[i-1] + dp[i-1][0];
}
for (int j=1; j<l2; j++) {
dp[0][j] = s2[j-1] + dp[0][j-1];
}
for (int i=1; i<l1; i++) {
for (int j=1; j<l2; j++) {
if (s1[i-1] == s2[j-1]) {
dp[i][j] = dp[i-1][j-1];
} else {
dp[i][j] = min(dp[i-1][j] + s1[i-1], dp[i][j-1] + s2[j-1]);
}
}
}
return dp[l1-1][l2-1];
}