HDU 1159 Common Subsequence 动态规划
2017-08-06?15:41:04
writer:pprp
剛開始學(xué)dp,集訓(xùn)的講的很難,但是還是得自己看,從簡(jiǎn)單到難,慢慢來(如果哪里有錯(cuò)誤歡迎各位大佬指正)
題意如下:
給兩個(gè)字符串,找到其中大的公共子序列,每個(gè)樣例輸出一個(gè)數(shù);
最長(zhǎng)公共子串(Longest Common Substirng)和最長(zhǎng)公共子序列(Longest Common Subsequence,LCS)的區(qū)別為:
子串是串的一個(gè)連續(xù)的部分,子序列則是從不改變序列的順序,而從序列中去掉任意的元素而獲得新的序列;
也就是說,子串中字符的位置必須是連續(xù)的,子序列則可以不必連續(xù)。
動(dòng)態(tài)規(guī)劃的思想:abcfbc 和 abfcab找匹配值(圖是大佬畫的,借用一下^_^)
可以看出:
狀態(tài)的定義:
當(dāng)前匹配到某一位置時(shí)已經(jīng)匹配的數(shù)目
狀態(tài)轉(zhuǎn)移:設(shè)記錄匹配狀態(tài)的二維數(shù)組叫a[1001][1001]
如果str1[i] == str2[j] 那么a[i][i] = a[i-1][j-1] + 1;
如果str1[i] != str2[j] 那么a[i][j] = max(a[i-1][j], a[i][j-1]);
狀態(tài)結(jié)束:
匹配完成
?
代碼如下:
#include <iostream> #include <string> #include <cstring>using namespace std;int a[1001][1001];int _max(int a, int b) {return a > b ? a : b; }int main() {string str1,str2;while(cin >> str1 >> str2){int len1 = str1.length();int len2 = str2.length();memset(a,0,sizeof(a));for(int i = 1 ; i <= len1 ; i++){for(int j = 1 ; j <= len2 ; j++){if(str1[i-1] == str2[j-1]){a[i][j] = a[i-1][j-1] + 1;}else{a[i][j] = _max(a[i-1][j],a[i][j-1]);}}}cout << a[len1][len2] << endl;}return 0; }
提交狀態(tài):ac
轉(zhuǎn)載于:https://www.cnblogs.com/pprp/p/7295014.html
總結(jié)
以上是生活随笔為你收集整理的HDU 1159 Common Subsequence 动态规划的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。