Pagini recente » Cod sursa (job #917570) | Cod sursa (job #2534367) | Cod sursa (job #2951638) | Cod sursa (job #2415821) | Cod sursa (job #712417)
Cod sursa(job #712417)
/*
#include <cstring>
#include <fstream>
#define Sigma 27
#define Lmax 511
#define maxim(a , b) ( ( a>b ) ? a : b )
using namespace std;
ifstream fin("palm.in");
ofstream fout("palm.out");
char A[Lmax];
int N, maxP[Lmax][Lmax][Sigma];
char Inf[Lmax][Lmax][Sigma],Sup[Lmax][Lmax][Sigma];
void SHL()
{
for (int i=N;i>=0;--i)
A[i+1]=A[i];
++N;
}
void Read()
{
fin >> A;
N = strlen(A)-1;
}
void Build_1(int i,int j)
{
++maxP[i][j][0];
for (int j2=1;j2<=maxP[i][j+1][0];++j2)
if ( maxP[i][j][maxP[i][j+1][j2]] > maxP[i][j][maxP[i][j][0]] )
{
maxP[i][j][maxP[i][j][0]]=maxP[i][j+1][maxP[i][j+1][j2]];
Inf[i][j][maxP[i][j][0]]=Inf[i][j+1][maxP[i][j+1][j2]];
Sup[i][j][maxP[i][j][0]]=Sup[i][j+1][maxP[i][j+1][j2]];
}
for (int j2=1;j2<=maxP[i+1][j][0];++j2)
if ( maxP[i][j][maxP[i+1][j][j2]] > maxP[i][j][maxP[i][j][0]] )
{
maxP[i][j][maxP[i][j][0]]=maxP[i+1][j][maxP[i+1][j][j2]];
Inf[i][j][maxP[i][j][0]]=Inf[i+1][j][maxP[i+1][j][j2]];
Sup[i][j][maxP[i][j][0]]=Sup[i+1][j][maxP[i+1][j][j2]];
}
}
void Build_2(int i,int j)
{
for (int j2=1;j2<=maxP[i+1][j+1][0];++j2)
if (A[i]<Sup[i+1][j+1][j2])
{
maxP[i][j][++maxP[i][j][0]]=maxP[i+1][j+1][j2]+2;
Inf[i][j][maxP[i][j][0]]=Inf[i+1][j+1][j2];
Sup[i][j][maxP[i][j][0]]=Sup[i+1][j+1][j2];
}
for (int j2=1;j2<=maxP[i][j+1][0];++j2)
if (A[i]==Sup[i][j+1][j2])
{
maxP[i][j][++maxP[i][j][0]]=maxP[i+1][j+1][j2]+1;
Inf[i][j][maxP[i][j][0]]=Inf[i+1][j+1][j2];
Sup[i][j][maxP[i][j][0]]=Sup[i+1][j+1][j2];
}
if (maxP[i][j][0]==0)
Build_1(i,j);
}
void Write()
{
int Max=0;
for (int i=1;i<=maxP[N][N][0];++i)
Max=maxim(maxP[N][N][i],Max);
fout<<Max<<'\n';
fin.close();
fout.close();
}
int main()
{
Read();
SHL();
for (int i=1;i<=N;++i)
{
maxP[i][i][1]=1;
Inf[i][i][1]=A[i];
Sup[i][i][1]=A[i];
maxP[i][i][0]=1;
}
for (int i=1;i<=N;++i)
for (int j=i+1;j<=N;++j)
if (A[i]!=A[j])
Build_1(i,j);
else
Build_2(i,j);
Write();
return 0;
}
*/
// SURSA I (viteza mai mare)
#include <cstring>
#include <fstream>
using namespace std;
char A[506];
int N, maxP[502][502][26];
int main()
{
ifstream fin("palm.in");
ofstream fout("palm.out");
fin >> A;
N = strlen(A);
for (int i = 1; i <= N; ++i)
for (int j = 0; j <= A[i - 1] - 'a'; ++j)
maxP[i][i][j] = 1;
for (int i = 2; i <= N; ++i) // marimea
for (int j = 1; j <= N - i + 1; ++j)
{
for (int k = 0; k <= 26; ++k)
maxP[j][j + i - 1][k] = max(maxP[j][j + i - 2][k], maxP[j + 1][j + i - 1][k]);
if (A[j - 1] == A[j + i - 2])
for (int k = 0; k <= A[j - 1] - 'a'; ++k)
{
if (i > 2)
maxP[j][j + i - 1][k] = max(maxP[j][j + i - 1][k], maxP[j + 1][j + i - 2][A[j - 1] - 'a'] + 2);
else
maxP[j][j + i - 1][k] = max(maxP[j][j + i - 1][k], 2);
}
}
fout << maxP[1][N][0];
fin.close();
fout.close();
}
// SURSA II - implementare usoara