String similarity
Sequence alignment
最近在学习动态规划的时候遇到了这样的问题:
给出两个字符串,求出两个字符串的相似性。相同字符对齐视为匹配,不同字符相对或者有落单的字符都会有penalty,求出最小的penalty.
在普林斯顿的PPT上也有相关的问题:
用动态规划很好思考,对于两个字符串A,B,对于 x i ∈ A , y i ∈ B x_i \in A, y_i \in B xi∈A,yi∈B ,只有三种情况,一是两个字符串相对,二是 y i y_i yi落单, x i x_i xi和 B B B中的下一个字符串 y i + 1 y_{i+1} yi+1匹配,三是 x i x_i xi落单, y i y_i yi和 x i + 1 x_{i+1} xi+1匹配。在这三种情况中取值最小的。
很轻易就能计算出penalty,例如对于DNA 来说,我们规定如下的对应值:
//动态规划
//假设gap()是字符没有匹配值时的penalty
//mismatch()是两个字符对应的penalty.
int dp(const string &x,const string &y)
{
int a=x.size(),b=y.size();
vector<vector<int> >