Cod sursa(job #1077006)

Utilizator thewildnathNathan Wildenberg thewildnath Data 10 ianuarie 2014 20:03:51
Problema Curcubeu Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.77 kb
#include<stdio.h>
#include<string.h>

#define NMAX 105

int v[NMAX];
int dp[NMAX][NMAX];

inline int min(const int &a,const int &b)
{
    return a<b?a:b;
}

int main()
{
    freopen("bilete.in","r",stdin);
    freopen("bilete.out","w",stdout);
    int n=0,i,j,k,l;
    char c;
    while(scanf("%c",&c)!=EOF)
    {
        if(c=='\n')break;
        if(c-'A'+1==v[n])
            continue;
        v[++n]=c-'A'+1;
    }

    for(i=0;i<NMAX;++i)
    {
        for(j=0;j<NMAX;++j)
            dp[i][j]=2000000000;
        dp[i][i]=1;
    }

    for(i=n;i>=1;--i)
    {
        for(j=i+1;j<=n;++j)
        {
            if(v[i]==v[j])
            {
                dp[i][j]=1;
                l=i;
                for(k=i+1;k<=j;++k)
                    if(v[k]==v[i])
                    {
                        dp[i][j]+=dp[l+1][k-1];
                        l=k;
                    }
            }
            else
            {
                if(i<j-1)
                {
                    dp[i][j]=dp[i+1][j-1]+2;
                    if(v[i]==v[i+1])
                        --dp[i][j];
                    if(v[j]==v[j-1])
                        --dp[i][j];
                }
                else
                    dp[i][j]=2;
                //////////////

                for(k=i+1;k<j;++k)
                {
                    if(dp[i][k]+dp[k+1][j]<dp[i][j])
                    {
                        dp[i][j]=dp[i][k]+dp[k+1][j];
                        if(v[k]==v[k+1])
                            --dp[i][j];
                        if(v[j]==v[j-1])
                            --dp[i][j];
                    }
                }

            }
        }
    }

    printf("%d\n",dp[1][n]);
    return 0;
}