Pagini recente » Cod sursa (job #2126760) | Borderou de evaluare (job #2332011) | Cod sursa (job #250400) | Borderou de evaluare (job #2298981) | Cod sursa (job #3233195)
#include <bits/stdc++.h>
using namespace std;
string s;
const int nmax = 2005;
int16_t memo[nmax][nmax];
int solve(int left, int right)
{
if(left > right)
return 0;
if(left == right)
return 1;
if(memo[left][right] != -1)
return memo[left][right];
if(s[left] == s[right])
return memo[left][right] = 2 + solve(left + 1, right - 1);
return memo[left][right] = max(solve(left + 1, right), solve(left, right - 1));
}
int main() {
freopen("elimin2.in", "r", stdin);
freopen("elimin2.out", "w", stdout);
cin >> s;
if(s.size() == 1)
{
cout << s << "\n";
return 0;
}
memset(memo, -1, sizeof(memo));
deque<int> p[10];
for(size_t i = 0;i < s.size();++i)
p[s[i] - '0'].push_back(i);
int len = 0;
for(int i = 1;i <= 9;++i)
{
if(!p[i].empty())
{
int l = p[i].front(), r = p[i].back();
if(l != r)
len = max(len, 2 + solve(l + 1, r - 1));
else
len = max(len, 1);
}
}
string ans, sol;
int left = -1, right = -1;
bool od = false;
while(len)
{
int end = 0;
if(left == -1)
end = 1;
for(int i = 9;i >= end;--i)
{
if(!p[i].empty())
{
if(p[i].size() == 1 && len == 1)
{
sol = ans;
sol += i + '0';
reverse(ans.begin(), ans.end());
sol += ans;
--len;
od = true;
break;
}
else if(p[i].size() >= 2)
{
int l = p[i].front(), r = p[i].back();
if(len == 2 + solve(l + 1, r - 1))
{
ans += i + '0';
len -= 2;
left = l + 1, right = r - 1;
break;
}
}
}
}
for(int i = 0;i <= 9;++i)
{
while(!p[i].empty() && p[i].front() < left)
p[i].pop_front();
}
for(int i = 0;i <= 9;++i)
{
while(!p[i].empty() && p[i].back() > right)
p[i].pop_back();
}
}
if(!od)
{
sol += ans;
reverse(ans.begin(), ans.end());
sol += ans;
}
cout << sol << "\n";
}