Pagini recente » Cod sursa (job #982764) | Cod sursa (job #2085259) | Profil RolandPetrean | Cod sursa (job #808210) | Cod sursa (job #1004814)
#include<fstream>
#include<string>
using namespace std;
int i,j,n,k,a[505][505][27],sir[505];
string s;
int main(void){
ifstream fin("palm.in");
ofstream fout("palm.out");
getline(fin,s);
// initializez
n=s.length();
for (i=1; i<=n; ++i) sir[i]=int(s[i-1])-96;
for (i=1; i<=n; ++i)
for (k=sir[i]; k>=1; --k) a[i][i][k]=1;
for (i=1; i<n; ++i)
if (sir[i]==sir[i+1])
for (k=sir[i]; k>=1; --k) a[i][i+1][k]=2;
else for (k=max(sir[i],sir[i+1]); k>=1; --k) a[i][i+1][k]=1;
// fac dinamica a[i][j][k]=cel mai lung subsir care se include in secventa i..j
// si are ultimul termen >=k
for (int lung=3; lung<=n; ++lung)
for (i=1; i<=n-lung+1; ++i){
int p1=i, p2=i+lung-1;
for (k=26; k>=1; --k)
if (k==sir[p1]&&k==sir[p2]) a[p1][p2][k]=a[p1+1][p2-1][k]+2;
else a[p1][p2][k]=max(a[p1+1][p2-1][k],max(a[p1][p2-1][k],a[p1+1][p2][k]));
for (k=25; k>=1; --k) a[p1][p2][k]=max(a[p1][p2][k],a[p1][p2][k+1]);
}
// solutia evident se afla in a[1][n][1]
fout<<a[1][n][1];
return(0);
}