HDU 4681 String (最长公共子序列)
2013-08-16 12:41
423 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4681
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; #define fi first #define se second const int N = 1111; char a , b , c ; int dp1 , dp2 , lena, lenb, lenc; pair<int, int> pos[2] ; void LCS() { for(int i=1; i<=lena; i++) { for(int j=1; j<=lenb; j++) { if(a[i] == b[j]) dp1[i][j] = dp1[i-1][j-1] + 1; else dp1[i][j] = max(dp1[i-1][j], dp1[i][j-1]); } } for(int i=lena; i>0; i--) { for(int j=lenb; j>0; j--) { if(a[i] == b[j]) dp2[i][j] = dp2[i+1][j+1] + 1; else dp2[i][j] = max(dp2[i][j+1], dp2[i+1][j]); } } } void findc(char str[], int &len, int n, int &num) { int i, j, k; for(i=1; i<=len; i++) { if(str[i] == c[1]) { for(j=i+1, k=2; j<=len && k<=lenc; j++) { if(str[j] == c[k]) k++; if(k == lenc+1) break; } if(k == lenc+1) { pos [num].fi = i; pos [num].se = j; num++; } else break; } } } int main() { int t; scanf("%d", &t); getchar(); for(int cases=1; cases<=t; cases++) { gets(a+1), lena = strlen(a+1); gets(b+1), lenb = strlen(b+1); gets(c+1), lenc = strlen(c+1); memset(dp1, 0, sizeof(dp1)); memset(dp2, 0, sizeof(dp2)); LCS(); int anum = 0, bnum = 0; findc(a, lena, 0, anum); findc(b, lenb, 1, bnum); int ans = 0; for(int i=0; i<anum; i++) { for(int j=0; j<bnum; j++) { ans = max(ans, dp1[pos[0][i].fi-1][pos[1][j].fi-1] + dp2[pos[0][i].se+1][pos[1][j].se+1]); } } printf("Case #%d: %d\n", cases, ans+lenc); } return 0; }
相关文章推荐
- hdu 4681 String/杭电多校第八场1006 最长公共子序列长
- HDU 4681 string 求最长公共子序列的简单DP+暴力枚举
- HDU 4681 String 最长公共子序列
- hdu 4681 String (动态规划-最长公共子序列)
- HDU 4681 String (动态规划)
- HDU 4681 String 正反求最长公共子序列+枚举
- hdu 4681 String(转载)
- HDU 4681 String(枚举 + LCS)
- HDU 4681 String(DP)
- HDU 4681 String(DP)
- 多校第八场 Hdu 4681 String
- hdu-4681-String
- hdu 4681 String 多校第八场
- hdu 4681 string
- HDU 4681 String 胡搞
- hdu 4681 string
- HDU - 4681 String
- HDU 4681 String(2013多校8 1006题 DP)
- HDU 4681 String(DP)
- hdu 4681 String (LCS)