程式設計練習 動態規劃(最長公共子串行LCS

2021-06-03 14:05:58 字數 1782 閱讀 1843

程式**如下:

#include #include #include templateclass dualarrayinternal 

t& operator(size_t y)

const t& operator(size_t y) const

void setx(size_t x)

private:

size_t x_;

t* array_data_;

size_t column_num_;

};templateclass dualarray

dualarrayinternal& operator(size_t x)

const dualarrayinternal& operator(size_t x) const

private:

dualarrayinternalinternal_;

};void print(int value)

templatevoid printsequence(const std::vector& array1, const dualarray& path_direction, const size_t i, const size_t j, printfun print_fun)

if (path_direction[i][j] == 's') else if(path_direction[i][j] == 'u') else

}templatevoid longestcommonsubsequence(std::vector& array1, const std::vector&array2)

for (size_t j = 0; j <= array2.size(); ++j)

for (size_t i = 1; i <= array1.size(); ++i) else if (subsequence_length[i - 1][j] >= subsequence_length[i][j - 1]) else

}} for (int i = 0; i <= array1.size(); ++i)

printf("\n");

}

printsequence(array1, path_direction, array1.size(), array2.size(),print);

printf("\n");

}class test;

int main(int argc, char** argv) ;

std::vectorarray_vector1(array1, array1 + sizeof(array1) / sizeof(char));

char array2 = ;

std::vectorarray_vector2(array2, array2 + sizeof(array2) / sizeof(char));

longestcommonsubsequence(array_vector2, array_vector1);

}

關鍵是下標的處理問題,容易出現錯誤的幾點是:

1)儲存矩陣的行列數量要計算清楚,矩陣多出1行和1列用於儲存初始值,這樣初始時i-1和j-1的位置不會溢位

2)由於矩陣的下標從1開始,而傳入的向量下標從0開始,因此訪問向量時下標要-1,對於print函式也是如此

3)注意dualarray的常量成員函式實現,為了滿足常量引數呼叫的需要,內部需要轉型操作

4)print的實現允許使用者定義的訪問函式,通過函式模板引數實現

動態規劃 最長公共子串行

問題描述 我們稱序列z z1,z2,zk 是序列x x1,x2,xm 的子串行當且僅當存在嚴格上公升的序列 i1,i2,ik 使得對j 1,2,k,有xij zj。比如z a,b,f,c 是x a,b,c,f,b,c 的子串行。現在給出兩個序列x和y,你的任務是找到x和y的最大公共子串行,也就是說要...

動態規劃 最長公共子串行

兩個序列的最長公共子序 lcs longest common length 的 每個字元可以不連續,如x y 那麼它們的最長公共子串行為。這是乙個經典的動態規劃問題,著手點還是找到 最精髓的 狀態轉移方程 假設x,y兩個序列的前i,j個位置的最大子串行已經找到為r i j 自底往上 那麼x i 與y...

動態規劃 最長公共子串行

看完演算法導論關於這部分內容之後的總結 關於最長公共子串行問題 給定兩個子串行 x y 求x和y長度最長的公共子串行。解決方法 首先先要了解lcs的最優子結構,令x y 為兩個子串行,z 為x和y的任意lcs。1 如果 xm yn 則 zk xm yn 且 zk 1 是 xm 1 和 yn 1 的乙...