【BZOJ 1090】[SCOI2003]字符串折叠
2017-10-31 20:36
337 查看
题目链接:传送门
题解:
f[l][r]表示将l到r合并成的最小长度,枚举中间点暴力判断是否有循环节即可
题解:
f[l][r]表示将l到r合并成的最小长度,枚举中间点暴力判断是否有循环节即可
//by sdfzchy #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; typedef long long LL; const int inf=(1<<30),N=100010,mod=1e9+7; int n,m; inline int in() { char tmp=getchar(); int res=0,f=1; while((tmp<'0'||tmp>'9')&&tmp!='-')tmp=getchar(); if(tmp=='-') f=-1,tmp=getchar(); while(tmp>='0'&&tmp<='9') res=(res<<1)+(res<<3)+(tmp^48),tmp=getchar(); return res*f; } int f[120][120]; char s[120]; int cal(int x) { int ret=0; while(x) ret++,x/=10; return ret; } bool ok(int l,int r,int k) { for(int i=k+1;i<=r;i++) if(s[l+(i-l)%(k-l+1)]!=s[i]) return 0; return 1; } int main() { scanf("%s",s+1); n=strlen(s+1); for(int i=1;i<=n;i++) f[i][i]=1; for(int i=1;i<n;i++) for(int l=1,r=l+i;r<=n;l++,r++) { f[l][r]=r-l+1; for(int k=l;k<r;k++) { f[l][r]=min(f[l][r],f[l][k]+f[k+1][r]); if((r-k)%(k-l+1)==0&&ok(l,r,k)) f[l][r]=min(f[l][r],f[l][k]+2+cal((r-l+1)/(k-l+1))); } } printf("%d",f[1] ); return 0; }
相关文章推荐
- bzoj1090: [SCOI2003]字符串折叠 区间dp+hash
- BZOJ 1090: [SCOI2003]字符串折叠 区间DP
- 【BZOJ】1090: [SCOI2003]字符串折叠(dp)
- bzoj 1090: [SCOI2003]字符串折叠【区间dp】
- [BZOJ 1090][SCOI 2003]字符串折叠(DP)
- 【bzoj1090】[SCOI2003]字符串折叠
- BZOJ 1090: [SCOI2003]字符串折叠|动态规划
- [DP] BZOJ1090: [SCOI2003]字符串折叠
- 【BZOJ 1090】【SCOI 2003】字符串折叠 【区间DP】
- BZOJ 1090: [SCOI2003]字符串折叠 区间动归
- BZOJ 1090 [SCOI2003]字符串折叠 区间DP
- bzoj 1090 [SCOI2003]字符串折叠
- BZOJ 1090: [SCOI2003]字符串折叠( 区间dp )
- [bzoj1090][SCOI2003]字符串折叠_区间dp
- bzoj 1090 [SCOI2003]字符串折叠(区间DP)
- bzoj1090 [SCOI2003]字符串折叠(区间dp+Hash)
- 【BZOJ1090】[SCOI2003]字符串折叠【区间DP】
- bzoj1090 [SCOI2003]字符串折叠
- BZOJ1090 [SCOI2003]字符串折叠
- BZOJ1090: [SCOI2003]字符串折叠