BZOJ1260

传送门:BZOJ1260

傻逼题。

f(i,j)[i,j] 则转移是

f(i,j)={s[i]=s[j],minf(i+1,j),f(i,j1)otherwise ,minf(i,k)+f(k+1,j),k[i,j1]

然后就可以Dp辣!!!

代码上的小细节见下。

#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;

const int INF=0x3f3f3f3f;

char S[105];
int f[105][105];
bool used[105][105];

int Dp(int l,int r)
{
    if(used[l][r])
        return f[l][r];
    if(S[l]==S[r])
        f[l][r]=min(Dp(l+1,r),Dp(l,r-1));
    else{
        f[l][r]=INF;
        for(int k=l;k1,r));
    }
    used[l][r]=true;
    return f[l][r];
}

void Readdata()
{
    scanf("%s",S+1);
}

void First()
{
    int l=strlen(S+1);
    memset(used,false,sizeof(used));
    for(int i=1;i<=l;i++)
        f[i][i]=used[i][i]=1;
}

void Solve()
{
    printf("%d\n",Dp(1,strlen(S+1)));
}

void Close()
{
    fclose(stdin);
    fclose(stdout);
}

int main()
{
    Readdata();
    First();
    Solve();
    Close();
    return 0;
}

你可能感兴趣的:(Dp,区间DP)