解题思路
在思考这一问题之前可以尝试解决******问题。
我们使用区间
来解决这一问题。
用
表示如下含义:
每个状态只有和
,可以考虑使用或运算。
于是开始推导状态转移:
边界条件:两个字符串中最多选出一个字符时,
代码
int dp[55][55][55][55];
void solve() {
string a, b;
cin >> a >> b;
memset(dp, 0, sizeof(dp));
int ans = 0;
int n = a.size(), m = b.size();
for (int len1 = 0;len1 <= n;len1++)
for (int len2 = 0;len2 <= m;len2++)
for (int l1 = 1;l1 <= n - len1 + 1;l1++)
for (int l2 = 1;l2 <= m - len2 + 1;l2++) {
int r1 = l1 + len1 - 1, r2 = l2 + len2 - 1;
if (len1 + len2 < 2) dp[l1][r1][l2][r2] = 1;
else {
if (r1 >= 1 && a[l1 - 1] == a[r1 - 1]) dp[l1][r1][l2][r2] |= dp[l1 + 1][r1 - 1][l2][r2];
if (r2 >= 1 && b[l2 - 1] == b[r2 - 1]) dp[l1][r1][l2][r2] |= dp[l1][r1][l2 + 1][r2 - 1];
if (r2 >= 1 && a[l1 - 1] == b[r2 - 1]) dp[l1][r1][l2][r2] |= dp[l1 + 1][r1][l2][r2 - 1];
if (r1 >= 1 && b[l2 - 1] == a[r1 - 1]) dp[l1][r1][l2][r2] |= dp[l1][r1 - 1][l2 + 1][r2];
}
if (dp[l1][r1][l2][r2]) ans = max(ans, len1 + len2);
}
cout << ans << endl;
return;
}

京公网安备 11010502036488号