Aizu2090LCS
Posted hesorchen
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Aizu2090LCS相关的知识,希望对你有一定的参考价值。
题目
Problem G: Repeated Subsequences
暴力分割,之后求LCS即可。
代码
#include <bits/stdc++.h>
using namespace std;
int dp[1010][1010];
string get(string a, string b)
{
// memset(dp, 0, sizeof dp);
int n = a.size(), m = b.size();
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
dp[i][j] = 0;
a = '#' + a;
b = '#' + b;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
{
if (a[i] == b[j])
dp[i][j] = max(dp[i - 1][j - 1] + 1, dp[i][j]);
else
dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);
}
int p1 = n, p2 = m;
string res = "";
while (1)
{
if (a[p1] == b[p2])
{
res += a[p1];
--p1, --p2;
}
else if (dp[p1 - 1][p2] == dp[p1][p2])
--p1;
else
--p2;
if (res.size() == dp[n][m])
break;
}
reverse(res.begin(), res.end());
return res;
}
string f(string a)
{
string res = "";
for (int i = 0; i < a.size() - 1; i++)
{
string f1 = a.substr(0, i + 1);
string f2 = a.substr(i + 1);
if (get(f1, f2).size() > res.size())
res = get(f1, f2);
}
return res;
}
int main()
{
string a;
while (cin >> a)
{
if (a[0] == '#')
break;
string ans = f(a);
cout << ans << endl;
}
return 0;
}
以上是关于Aizu2090LCS的主要内容,如果未能解决你的问题,请参考以下文章
[Aizu] ITP2_9_A~D: Set Operation