最長公共單詞,類似LCS, POJ2250

2022-04-01 08:33:08 字數 1422 閱讀 1580

解題報告:

1、狀態轉移方程:

for(i=1; i<=len1; i++)

}

2、記錄決策

3、反序輸出

#include #include 

#include

#include

using

namespace

std;

#define maxv 110

#define maxn 35

char

stemp[maxn];

char

s1[maxv][maxn];

char s2[maxv][maxn];///

記錄單詞

int len1,len2;///

單詞長度

int dp[maxv][maxv]; ///

dp[i][j]表示s1的前i個單詞,和s2的前j個單詞,最長公共子單詞

int p[maxv][maxv]; ///

決策,如果s1的第i個單詞,和s2的第j個單詞相同,則為1,以便輸出使用

int pos[maxv]; ///

輸出結果

int sum; ///

有幾個單詞

int _max(int i,int j,int a,int b,int

c)

else

if(b>a&&b>c)

p[i][j]=3

;

returnc;}

int same(int x,int

y)void print(int i,int

j)

else

if(p[i][j]==2

) print(i-1

,j);

else

if(p[i][j]==3

) print(i,j-1);}

intmain()

while(1

)

///dp

/// memset(dp,0,sizeof

(dp));

memset(p,

0,sizeof

(p));

for(i=1; i<=len1; i++)

}///output

/// sum=0

; print(len1,len2);

for(i=sum-1; i>=0; i--) ///

反序輸出

printf("

%s "

,s1[pos[i]]);

puts(

"");

}return0;

}

動態規劃2 最長公共子串行

最長公共子串行1 所有的回溯找路徑 記錄之前來的路徑 找兩個字串的最長公共子串行 char s1 maxlen char s2 maxlen 答案為4 遞推公式 回溯路徑 最長公共子串行2 回溯法求路徑 3所有的回溯找路徑 記錄之前來的路徑 41 遞推公式 5 分最後乙個相同和最後乙個不同來分析 6...

動態規劃2 最長公共子串行

問題是給定字串x和y,求出兩個當中最長的公共子串行。比如x abcdef y acefg,那麼他們的最長公共子串行就是acef。就是求x的所有可能的子字串與y所有的子字串匹配,如果相同,那麼就是乙個公共子串行,然後求最長的乙個。建議 上面的公開課,講的非常好。本文思路是根據上面的公開課總結實踐的。我...

NYOJ 37 回文字串(類似最長公共子串行)

描述 所謂回文字串,就是乙個字串,從左到右讀和從右到左讀是完全一樣的,比如 aba 當然,我們給你的問題不會再簡單到判斷乙個字串是不是回文字串。現在要求你,給你乙個字串,可在任意位置新增字元,最少再新增幾個字元,可以使這個字串成為回文字串。輸入 第一行給出整數n 0 輸出每行輸出所需新增的最少字元數...