码迷,mamicode.com
首页 > 其他好文 > 详细

BZOJ1260

时间:2015-08-26 12:18:08      阅读:113      评论:0      收藏:0      [点我收藏+]

标签:dp   区间dp   

传送门:BZOJ1260

傻逼题。

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

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

然后就可以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;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

BZOJ1260

标签:dp   区间dp   

原文地址:http://blog.csdn.net/le_ballon_rouge/article/details/47999525

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!