一. 問題描述
給定兩個字串,求解這兩個字串的最長公共子串行(longest common sequence)。比如字串1:bdcaba;字串2:abcbdab
則這兩個字串的最長公共子串行長度為4,最長公共子串行是:bcba
二.尋找最優子結構,
用dp[i][j] 來表示第乙個字串前 i 個字元和第二個字串前 j 個字元的最優解(最長公共子串行);
有兩種可能: (字元陣列 s1[n] 和字元陣列 s2[n] )
1 . s1[i] == s2[j] , dp[i][j] = dp[i-1][j- ]+1 : 如果s1[i] == s2[j] 那麼說明dp[i][j] 的最優解是dp[i-1][j-1]的最優解加一;
2 . s1[i] != s2[j] , 如果 dp[i][j-1] > dp[i-1][j] ,那麼dp[i][j] = dp[i][j-1] ; 如果dp[i-1][j] > d[i][j-1] ,那麼dp[i][j] = dp[i-1][j];
#include #include #include #include #include #include #define max 10
using namespace std;
int maxl(string &str1,string &str2,int bt[max][max])else if(dp[i-1][j] > dp[i][j-1])else
}} void traceback(int i,int j,int bt[max][max],string &x)else if(bt[i][j] == 2)
traceback(i-1,j,bt,x); //操作2:最優解進行的操作是2,不輸出,直接追溯到str1的i-1個字元和str2的j個字元的最優解
else
traceback(i,j-1,bt,x); //操作3:最優解進行的操作是2,不輸出,直接追溯到str1的i個字元和str2的j-1個字元的最優解 }}
int main()
夜深人靜寫演算法 排列問題 分治)
採用分治法,把乙個字串看成兩部分 第一部分是它的第乙個字元,第二部分是後面的所有字元。這樣字串的全排列就變成了第二部分的全排列,前提是要將第乙個字元的情況全部列舉出來。1 首先求所有可能出現在第乙個位置的字元,也就是把第乙個字元和後面的所有字元交換 2 然後在把後面的字串看成新的字串從 1 如果最後...
夜深人靜寫演算法 快速排序(分治)
快速排序 採用分治的方法 一 1 將陣列的第乙個作為參考值,將所有小於該值的數移動到改值左側,將所有大於該值的數移動到陣列右側 利用兩個指標分別從陣列的首尾開始向中間掃瞄 2 將參考值的左側和右側看作新的兩個陣列 3 重新從 1 開始,直到陣列的大小為0 二 如圖為第一次遞迴,將小於23的移到左側,...
夜深人靜寫演算法(十二) 凸包
三 graham 掃瞄法 四 凸包的應用 人生當中成功只是一時的,失敗卻是主旋律,但是如何面對失敗,就把人分成了三六九等。有的人會被失敗擊垮,一蹶不振 有的人卻能夠直面失敗,迎難而上。這個世上只有一種英雄主義,那就是 認清生活的真相,並且仍然熱愛它!難道向上攀爬的這條路不是比站在頂峰更讓人熱血澎湃嗎...