nyoj36最长公共子序列 动态规划
生活随笔
收集整理的這篇文章主要介紹了
nyoj36最长公共子序列 动态规划
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目鏈接:http://115.159.40.116/problem_show.php?pid=4648
tip:最長公共子序列也稱作最長公共子串(不要求連續),英文縮寫為LCS(Longest Common Subsequence)。其定義是,一個序列 S ,如果分別是兩個或多個已知序列的子序列,且是所有符合此條件序列中最長的,則 S 稱為已知序列的最長公共子序列。
接下來每組數據兩行,分別為待測的兩組字符串。每個字符串長度不大于1000.
AC代碼:
#include <stdio.h> #include <string.h> char a[1005], b[1005]; int dp[1002][1002]; void Count(int n, int m) {for(int i = 1; i <= n; i++) {for(int j = 1; j <= m; j++) {if(a[i-1] == b[j-1]) dp[i][j] = dp[i-1][j-1]+1; else dp[i][j] = dp[i-1][j]>dp[i][j-1]?dp[i-1][j]:dp[i][j-1];}} } int main() {int N, lenA, lenB;scanf("%d\n", &N);while(N--) {memset(dp,0,sizeof(dp));scanf("%s%s", a, b);lenA = strlen(a);lenB = strlen(b);Count(lenA,lenB);printf("%d\n", dp[lenA][lenB]);}return 0; }
http://acm.nyist.net/JudgeOnline/problem.php?pid=36
題目描述
咱們就不拐彎抹角了,如題,需要你做的就是寫一個程序,得出最長公共子序列。tip:最長公共子序列也稱作最長公共子串(不要求連續),英文縮寫為LCS(Longest Common Subsequence)。其定義是,一個序列 S ,如果分別是兩個或多個已知序列的子序列,且是所有符合此條件序列中最長的,則 S 稱為已知序列的最長公共子序列。
輸入
第一行給出一個整數N(0<N<100)表示待測數據組數接下來每組數據兩行,分別為待測的兩組字符串。每個字符串長度不大于1000.
輸出
每組測試數據輸出一個整數,表示最長公共子序列長度。每組結果占一行。樣例輸入
2 asdf adfsd 123abc abc123abc樣例輸出
3 6AC代碼:
#include <stdio.h> #include <string.h> char a[1005], b[1005]; int dp[1002][1002]; void Count(int n, int m) {for(int i = 1; i <= n; i++) {for(int j = 1; j <= m; j++) {if(a[i-1] == b[j-1]) dp[i][j] = dp[i-1][j-1]+1; else dp[i][j] = dp[i-1][j]>dp[i][j-1]?dp[i-1][j]:dp[i][j-1];}} } int main() {int N, lenA, lenB;scanf("%d\n", &N);while(N--) {memset(dp,0,sizeof(dp));scanf("%s%s", a, b);lenA = strlen(a);lenB = strlen(b);Count(lenA,lenB);printf("%d\n", dp[lenA][lenB]);}return 0; }
總結
以上是生活随笔為你收集整理的nyoj36最长公共子序列 动态规划的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MiniDao1.7.1 版本发布,轻量
- 下一篇: 贝壳找房技术总监肖鹏:高速成长下的技术团