bzoj1939: [Croatian2010] Zuma

来源:互联网 发布:淘宝买家怎么修改评价 编辑:程序博客网 时间:2024/06/06 07:15

传送门
看英文题解的辣。上图:
这里写图片描述
这里写图片描述
翻译过来是:
f[i][j][k]表示消除第i个到第j个珠子,且第i个珠子前面有k个同色珠子的最优解。
有三种转移:
1.插入一个:f[i][j][k]=f[i][j][k-1]+1
2.k=K-1时在前面插入之后消掉:f[i][j][k]=f[i+1][j][0];
3.消除中间一段后和前面合并。要求两段同色:
f[i][j][k]=f[i+1][l-1][0]+f[l][j]k+1
剩下的我就不翻译了

#include<cmath>#include<cstdio>#include<cstdlib>#include<cstring>#include<iostream>#include<algorithm>using namespace std;int f[105][105][5],a[105],n,k;int dp(int l,int r,int x){    if (l>r) return 0;    if (l==r) return k-1-x;    if (f[l][r][x]!=-1) return f[l][r][x];    int tmp=1e9;    if (x<k-1) tmp=dp(l,r,x+1)+1;    else tmp=dp(l+1,r,0);    for (int i=l+1;i<=r;i++)        if (a[i]==a[l])            tmp=min(tmp,dp(l+1,i-1,0)+dp(i,r,min(k-1,x+1)));    return f[l][r][x]=tmp;}int main(){    scanf("%d%d",&n,&k);    for (int i=1;i<=n;i++) scanf("%d",&a[i]);    memset(f,-1,sizeof(f));    printf("%d\n",dp(1,n,0));}
原创粉丝点击