解題報告:
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 輸出每行輸出所需新增的最少字元數...