BZOJ1260

来源:互联网 发布:linux .gitignore文件 编辑:程序博客网 时间:2024/05/18 21:48

传送门: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 <cstdio>#include <cstdlib>#include <cmath>#include <cstring>#include <algorithm>#include <iostream>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;k<r;k++)            f[l][r]=min(f[l][r],Dp(l,k)+Dp(k+1,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;}
0 0
原创粉丝点击