Cod sursa(job #1857240)

Utilizator iordache.bogdanIordache Ioan-Bogdan iordache.bogdan Data 25 ianuarie 2017 22:26:55
Problema Elimin 2 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.92 kb
#include <fstream>
#include <vector>
#include <cstring>
#include <algorithm>

const int kMaxDim = 2005;

int length;
char text[kMaxDim], solution[kMaxDim];
int 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], 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;
		}

		int 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 = precRig[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!