BZOJ 1090: [SCOI2003]字符串折叠

Sol

区间DP.

转移很简单,枚举会形成的断长转移就行,话说上一题我就跟这个是差不多的思路,转移改了改,然后死活过不了...

同样都是SCOI的题...相差4年...

Code

/**************************************************************
    Problem: 1090
    User: BeiYu
    Language: C++
    Result: Accepted
    Time:20 ms
    Memory:1332 kb
****************************************************************/
 
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
 
const int N = 105;
 
char c[N];
int f[N][N];
 
int bit(int x){ if(x>=100) return 3;if(x>=10) return 2;return 1; }
int DP(int l,int r){
    int &res=f[l][r];if(~res) return res;
    if(l>r) return res=0;if(l==r) return res=1;int len=r-l+1;res=len;
    for(int i=1;i<=len/2;i++) if(len%i==0){
        int can=1;
        for(int j=l+i;j<=r;j++) if(c[j]!=c[(j-l)%i+l]){ can=0;break; }
        if(can) res=min(res,DP(l,l+i-1)+2+bit(len/i));
    }for(int i=l;i<r;i++) res=min(res,DP(l,i)+DP(i+1,r));
    return res;
}
 
int main(){
    scanf("%s",c+1);int n=strlen(c+1);memset(f,-1,sizeof(f));
    cout<<DP(1,n)<<endl;
    return 0;
}

  

posted @ 2016-08-18 14:52  北北北北屿  阅读(171)  评论(0编辑  收藏  举报