Pagini recente » Rating Iacob Victor (carnatz99) | Cod sursa (job #8447) | Cod sursa (job #1729990) | Cod sursa (job #596669) | Cod sursa (job #1768863)
#include <fstream>
#include <cstring>
using namespace std;
ifstream f ("elimin2.in");
ofstream g ("elimin2.out");
int dp[2005][2005] , dr[2005][15] , st[2005][15] , v[2005];
int n;
char sir[2005];
void afis (int inc , int sf);
int main() {
f >> sir + 1;
n = strlen(sir + 1);
for (int i = 1; i <= n; ++i) {
v[i] = sir[i] - '0';
}
for (int k = 0; k < 10; k++)
dr[n + 1][k] = n + 1;
for (int i = n; i >= 0; i--) {
for (int k = 0; k < 10; k++)
dr[i][k] = dr[i + 1][k];
dr[i][v[i]] = i;
}
for (int k = 0; k < 10; k++)
st[0][k] = 0;
for (int i = 1; i <= n + 1; i++) {
for (int k = 0; k < 10; k++)
st[i][k] = st[i - 1][k];
st[i][v[i]] = i;
}
for (int i = 1; i <= n; ++i) {
dr[i][v[i]] = dr[i + 1][v[i]];
}
for (int i = n; i >= 1; --i) {
st[i][v[i]] = st[i - 1][v[i]];
}
for (int i = 1; i <= n; ++i) {
dp[i][i] = 1;
}
for (int d = 2; d <= n; ++d) {
for (int i = 1; i <= n - d + 1; ++i) {
int j = i + d - 1;
if (j > n) {
break;
}
int aux1 = 0;
if (dr[i][v[i]] <= j)
aux1 = dp[i + 1][dr[i][v[i]] - 1] + 2;
if (st[j][v[j]] >= i)
aux1 = max (aux1 , dp[st[j][v[j]] + 1][j - 1] + 2);
int aux2 = max (dp[i][j - 1] , dp[i - 1][j]);
dp[i][j] = max (aux1 , aux2);
if (v[i] == v[j]) {
dp[i][j] = max (dp[i][j] , 2 + dp[i + 1][j - 1]);
}
}
}
int p1 , p2 , mx = 0 , pos;
for (int i = 1; i <= 9; ++i) {
if (dp[dr[0][i]][st[n + 1][i]] >= mx) {
mx = dp[dr[0][i]][st[n + 1][i]];
p1 = dr[0][i];
p2 = st[n + 1][i];
pos = i;
}
}
g << pos;
afis (p1 + 1 , p2 - 1);
if (dp[1][n] > 1) {
g << pos;
}
return 0;
}
void afis (int inc , int sf) {
if (sf < inc) {
return;
}
int p1 , p2 , mx = 0 , pos;
for (int i = 0; i <= 9; ++i) {
if (dp[dr[inc - 1][i]][st[sf + 1][i]] >= mx) {
mx = dp[dr[inc - 1][i]][st[sf + 1][i]];
p1 = dr[inc - 1][i];
p2 = st[sf + 1][i];
pos = i;
}
}
g << pos;
afis (p1 + 1 , p2 - 1);
if (p2 != p1) {
g << pos;
}
}