BZOJ 1068 (区间DP)

Posted GFY

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了BZOJ 1068 (区间DP)相关的知识,希望对你有一定的参考价值。

题意:字符串的压缩,f[l][r][0]代表还没M,f[l][r][1]代表有M。

 1 #include<cstdio>
 2 #include<cmath>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<iostream>
 6 int f[55][55][2],n;
 7 char s[555];
 8 bool ok(int l,int r){
 9           int len=(r-l+1)/2;
10           for (int i=1;i<=len;i++)
11             if (s[l+i-1]!=s[l+len-1+i]) return 0;
12           return 1;     
13 }
14 int dp(int l,int r,int id){
15       if (f[l][r][id]!=-1) return f[l][r][id];
16       f[l][r][id]=r-l+1;
17       if (l==r) return f[l][r][id]=1;
18       int x=r-l+1,len=x;
19       if (id)
20       for (int i=l;i<r;i++) x=std::min(x,dp(l,i,1)+1+dp(i+1,r,1));
21       for (int i=l;i<r;i++) x=std::min(x,dp(l,i,id)+r-i);
22       if (len%2==0&&ok(l,r))
23         x=std::min(x,dp(l,l+len/2-1,0)+1);
24       return f[l][r][id]=x;
25 }
26 int main(){
27        scanf("%s",s+1);
28        int n=strlen(s+1);
29        for (int i=1;i<=n;i++)
30          for (int j=1;j<=n;j++)
31           for (int k=0;k<=1;k++)
32             f[i][j][k]=-1;
33        printf("%d\n",dp(1,n,1));
34 }

 

以上是关于BZOJ 1068 (区间DP)的主要内容,如果未能解决你的问题,请参考以下文章

bzoj 1068: [SCOI2007]压缩区间dp

bzoj1068题解

B1068 [SCOI2007]压缩 区间dp

BZOJ 1068 SCOI2007 压缩

bzoj1068

BZOJ1260 [CQOI2007]涂色paint(区间dp)