時間限制:
3000
ms | 記憶體限制:
65535
kb難度:
3 描述
咱們就不拐彎抹角了,如題,需要你做的就是寫乙個程式,得出最長公共子串行。
tip:最長公共子串行也稱作最長公共子串(不要求連續),英文縮寫為lcs(longest common subsequence)。其定義是,乙個序列 s ,如果分別是兩個或多個已知序列的子串行,且是所有符合此條件序列中最長的,則 s 稱為已知序列的最長公共子串行。
輸入第一行給出乙個整數n(0
輸出每組測試資料輸出乙個整數,表示最長公共子串行長度。每組結果佔一行。
樣例輸入
2asdf
adfsd
123abc
abc123abc
樣例輸出
36
/*求最長公共子串行。動態規劃問題。
設序列x = (x1; x2; . . . ; xm) 和y =(y1; y2; . . . ; yn) 的最長公共子串行為
z = (z1; z2; . . . ; zk),
則. 若xm = yn,則zk = xm = yn,且zk-1 是xm-1 和yn-1 的最長公共子串行。
. 若xm != yn 且zk != xm,則z 是xm-1 和y 的最長公共子串行。
. 若xm != yn 且zk != yn,則z 是x 和yn-1 的最長公共子串行。
其中xm-1 = (x1; x2; . . . ; xm-1), yn-1 = (y1; y2; . . . ; yn-1), zk-1 = (z1; z2; . . . ; zk-1)
*/一般解法,不優化空間。
#include #include #define max 1010
int dp[max][max] = ;
void lcs(const char *x, int m, const char *y, int n)
for (j=0;j<=n; j++)
for (i=1; i<=m; i++)
else
} }}
int main()
return 0;
}
滾動陣列,優化空間
#include #include #define max 1001
short dp[2][max];
int main()
else
}} printf("%d\n",dp[e][ylen]);
} return 0;
}
NYOJ36 最長公共子串行
題目分析 假設兩個字串分別標記為str1和str2。建立乙個二維的表dp,dp i j 表示str1的前i個字元和str2的前j個字元的最長公共子串行的個數,遍歷str1和str2的所有元素,如果str1 i str2 j 則dp i j dp i 1 j 1 1 否則dp i j max dp i...
nyoj 36 最長公共子串行
時間限制 3000 ms 記憶體限制 65535 kb 難度 3 描述 咱們就不拐彎抹角了,如題,需要你做的就是寫乙個程式,得出最長公共子串行。tip 最長公共子串行也稱作最長公共子串 不要求連續 英文縮寫為lcs longest common subsequence 其定義是,乙個序列 s 如果分...
NYOJ 36 最長公共子串行
題目資訊 時間限制 3000 ms 記憶體限制 65535 kb 難度 3 描述 咱們就不拐彎抹角了,如題,需要你做的就是寫乙個程式,得出最長公共子串行。tip 最長公共子串行也稱作最長公共子串 不要求連續 英文縮寫為lcs longest common subsequence 其定義是,乙個序列 ...