TC SRM601 div2 p1000
2013-12-23 15:34
162 查看
题目大意
给三个字符串A,B,C,求一个字符串S,其中,S是A和B的子序列,同时C是S的子串,求S最长的长度解题思路
首先,S一定是A和B公共子序列,那么首先求LIS是一定的了,但是问题就在于怎么把C给放进去对于A和B的每一个位置,我们可以依次对C里面的所有字符寻找,知道找到C的尾部,然后将此位置开始,依次匹配完C的所有字符之后的最后一个位置记录下来,如果没有的话就标记为无法匹配,然后对A和B正向反向分别求一边LIS,然后,枚举A和B的每一个位置,答案应该就是到当前位置的正向LIS,加上A和B的当前位置匹配完C以后的最后一个位置到最后的反向LIS,加上C的长度就应该是当前位置所得到的一个解,然后所有的位置取一个最大值,就是最终的答案。
代码
int firstA[2505], firstB[2505], lis[2505][2505], lis1[2505][2505]; class WinterAndReindeers { public: void getlis(int lis[][2505], string A, string B){ for (int i = 0; i < A.size(); i++) for (int j = 0; j < B.size(); j++){ if (i) lis[i][j] = lis[i - 1][j]; if (j) lis[i][j] = max(lis[i][j], lis[i][j - 1]); if (A[i] == B[j]) lis[i][j] = max(lis[i][j], ((i && j) ? lis[i - 1][j - 1] : 0) + 1); } } int getNumber(vector <string> allA, vector <string> allB, vector <string> allC) { string A = "", B = "", C = ""; for (int i = 0; i < allA.size(); i++) A += allA[i]; for (int i = 0; i < allB.size(); i++) B += allB[i]; for (int i = 0; i < allC.size(); i++) C += allC[i]; for (int i = 0; i < A.size(); i++){ int j, k; for (j = 0, k = i; j < C.size() && k < A.size(); k++) if (C[j] == A[k]) j += 1; if (j == C.size()) firstA[i] = k; else firstA[i] = -1; } for (int i = 0; i < B.size(); i++){ int j, k; for (j = 0, k = i; j < C.size() && k < B.size(); k++) if (C[j] == B[k]) j += 1; if (j == C.size()) firstB[i] = k; else firstB[i] = -1; } getlis(lis, A, B); reverse(A.begin(), A.end()); reverse(B.begin(), B.end()); getlis(lis1, A, B); int ans = 0; for (int i = 0; i < A.size(); i++) for (int j = 0; j < B.size(); j++){ if (firstA[i] == -1 || firstB[j] == -1) continue; int tmp = (i && j) ? lis[i - 1][j - 1] : 0; int l1 = A.size() - 1 - firstA[i]; int l2 = B.size() - 1 - firstB[j]; int tmp1 = (l1 >= 0 && l2 >= 0) ? lis1[l1][l2] : 0; ans = max(tmp + (int)C.size() + tmp1, ans); } return ans; } };
相关文章推荐
- TC SRM573 div2 p1000
- Jquery DIV+javascript自适应大小窗口
- 图片无缝滚动代码(DIV+CSS+JavaScript)
- ie6,7下空DIV无任何内容时占据空间问题解决
- css+div
- srm 307 div2 1000(数论,枚举)
- HDU 5597 GTW likes function(规律+欧拉函数模板题)——BestCoder Round #66(div.1 div.2)
- CSS div水平垂直居中和div置于底部
- css 实现div内显示两行或三行,超出部分用省略号显示
- 设置div高度为100%
- 超级变态让div span dd可以当文本框用
- 设置DIV内内容自适应屏幕
- Codeforces Beta Round #65 (Div. 2) / 71A Way Too Long Words(字符串操作)
- POJ 1845 Sumdiv
- 导航菜单1(div+css)
- Codeforces Round #335 (Div. 2) B
- H5学习小结——div+css创建电子商务静态网页
- div中控制文字行数并且文末“...”显示
- 【Codeforces Round 362 (Div 2)D】【树的遍历 概率均分思想】
- datalist 摸板列 div