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

BZOJ 1068 (区间DP)

时间:2016-06-02 18:20:51      阅读:419      评论:0      收藏:0      [点我收藏+]

标签:

题意:字符串的压缩,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)

标签:

原文地址:http://www.cnblogs.com/qzqzgfy/p/5553767.html

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