Pagini recente » Cod sursa (job #288332) | Cod sursa (job #573967) | Cod sursa (job #277881) | Cod sursa (job #829276) | Cod sursa (job #1474623)
#include<fstream>
#include<cstring>
using namespace std;
ifstream f("palm.in"); ofstream g("palm.out");
int a[505][505][27];// a[i][j][k]=cel mai lg subsir x care se include in secventa i..j si are ultimul termen >=k
int main(void)
{ int n,i,j,k,x[5050]; char s[505];
f>>s;
// initializari
n=strlen(s);
for(i=1;i<=n;++i) x[i]=int(s[i-1])-96;
for(i=1;i<=n;++i)
for(k=x[i];k;--k) a[i][i][k]=1;
for(i=1;i<n;++i)
if(x[i]==x[i+1]) for(k=x[i];k;--k) a[i][i+1][k]=2;
else for(k=max(x[i],x[i+1]);k;--k) a[i][i+1][k]=1;
// fac dinamica
for (int lg=3;lg<=n;++lg)
for(i=1;i<=n-lg+1;++i)
{ int p=i, u=i+lg-1;
for(k=26;k;--k)
if(k==x[p]&&k==x[u]) a[p][u][k]=a[p+1][u-1][k]+2;
else a[p][u][k]=max(a[p+1][u-1][k],max(a[p][u-1][k],a[p+1][u][k]));
for (k=25;k;--k) a[p][u][k]=max(a[p][u][k],a[p][u][k+1]);
}
g<<a[1][n][1]<<'\n'; g.close(); return(0);
}