zoukankan      html  css  js  c++  java
  • 【BZOJ 1068】[SCOI2007]压缩

    Description

    给 一个由小写字母组成的字符串,我们可以用一种简单的方法来压缩其中的重复信息。压缩后的字符串除了小写字母外还可以(但不必)包含大写字母R与M,其中M 标记重复串的开始,R重复从上一个M(如果当前位置左边没有M,则从串的开始算起)开始的解压结果(称为缓冲串)。 bcdcdcdcd可以压缩为bMcdRR,下面是解压缩的过程:

     

    另一个例子是abcabcdabcabcdxyxyz可以被压缩为abcRdRMxyRz。

    Input

    输入仅一行,包含待压缩字符串,仅包含小写字母,长度为n。

    Output

    输出仅一行,即压缩后字符串的最短长度。

    Sample Input

    bcdcdcdcdxcdcdcdcd

    Sample Output

    12

    HINT

    在第一个例子中,解为aaaRa,在第二个例子中,解为bMcdRRxMcdRR。

    【限制】

    100%的数据满足:1<=n<=50 100%的数据满足:1<=n<=50

    区间型DP

    f[i][j][0] 表示从i到j中间没有M,f[i][j][1]表示i到j中间有M

    f[i][j][0]=min(f[i][k][0]+f[k+1][j][0]+1)表示i到j这一段可以拆成i到k和k+1到j,中间加一个M以避免影响

    f[i][j][t]=min(f[i][k][t]+j-k)表示先压缩i到k段后一段不压缩

    f[i][j][t]=min(f[i][(i+j)>>1][t]+1)表示一段从中间劈开压缩加一个R

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<iostream>
     4 using namespace std;
     5 char s[100];
     6 int f[60][60][2];
     7 bool same(int l,int r){
     8     int tmp=(r-l+1);
     9     if(tmp%2==1) return 0;
    10     for(int i=l;i<=(l+r)>>1;i++)
    11     if(s[i]!=s[i+tmp/2]) return 0;
    12     return 1;
    13 }
    14  
    15 int dp(int l,int r,int t){
    16     if(f[l][r][t]!=-1) return f[l][r][t];
    17     int tmp=(r-l+1);
    18     if(tmp==1) return 1;
    19     if(t) for(int i=l;i<r;i++)
    20     tmp=min(tmp,dp(l,i,1)+dp(i+1,r,1)+1);
    21     for(int i=l;i<r;i++) tmp=min(tmp,dp(l,i,t)+r-i);
    22     if(same(l,r)) tmp=min(tmp,dp(l,(l+r)>>1,0)+1);
    23     f[l][r][t]=tmp;
    24     return tmp;
    25 }
    26  
    27 int main(){
    28     scanf("%s",s+1);
    29     int len=strlen(s+1);
    30     memset(f,-1,sizeof(f));
    31     printf("%d",dp(1,len,1));
    32 }
  • 相关阅读:
    Longest Palindromic Substring
    PayPal MLSE job description
    Continuous Median
    Remove Duplicates From Linked List
    Valid IP Address
    Longest substring without duplication
    Largest range
    Subarray sort
    Multi String Search
    Suffix Trie Construction
  • 原文地址:https://www.cnblogs.com/wuminyan/p/5215688.html
Copyright © 2011-2022 走看看