Pagini recente » Cod sursa (job #1401690) | Cod sursa (job #2828950) | Cod sursa (job #942900) | Cod sursa (job #507003) | Cod sursa (job #1857254)
#include <fstream>
#include <vector>
#include <cstring>
#include <algorithm>
const int kMaxDim = 2005;
int length;
char text[kMaxDim], solution[kMaxDim];
short dp[kMaxDim][kMaxDim], precLef[kMaxDim][10], precRig[kMaxDim][10];
void ComputeDp() {
for (int i = 1; i <= length; ++i)
dp[i][i] = 1;
for (int dist = 2; dist <= length; ++dist)
for (int i = 1, j = dist; j <= length; ++i, ++j) {
dp[i][j] = std::max(dp[i + 1][j], dp[i][j - 1]);
if (text[i] == text[j])
dp[i][j] = std::max(dp[i][j], short(dp[i + 1][j - 1] + 2));
}
}
void ComputePrec() {
for (int i = 1; i <= length; ++i) {
for (int j = 0; j < 10; ++j)
precLef[i][j] = precLef[i - 1][j];
precLef[i][text[i] - '0'] = i;
}
for (int i = length; i; --i) {
for (int j = 0; j < 10; ++j)
precRig[i][j] = precRig[i + 1][j];
precRig[i][text[i] - '0'] = i;
}
}
void ComputeSolution() {
int left = 0, right = length + 1;
int begin = 1, end = 1;
int minPossibleDigit = 1;
while (right - left >= 2) {
if (right - left == 2) {
solution[begin] = text[left + 1];
break;
}
short best = 0;
for (int i = minPossibleDigit; i < 10; ++i)
best = std::max(best, dp[precRig[left + 1][i]][precLef[right-1][i]]);
for (int i = 9; i >= minPossibleDigit; --i) {
if (best != dp[precRig[left + 1][i]][precLef[right-1][i]])
continue;
if (minPossibleDigit == 1) {
begin = 1;
end = best;
minPossibleDigit = 0;
}
solution[begin++] = solution[end--] = i + '0';
left = precRig[left + 1][i];
right = precLef[right - 1][i];
break;
}
}
}
int main() {
std::ifstream inputFile("elimin2.in");
std::ofstream outputFile("elimin2.out");
inputFile >> (text + 1);
length = strlen(text + 1);
ComputeDp();
ComputePrec();
ComputeSolution();
outputFile << (solution + 1) << '\n';
inputFile.close();
outputFile.close();
return 0;
}
//Trust me, I'm the Doctor!