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

BZOJ1090: [SCOI2003]字符串折叠

时间:2016-06-23 22:20:41      阅读:302      评论:0      收藏:0      [点我收藏+]

标签:

...

技术分享
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int read(){
 4   int x=0,f=1;char ch=getchar();
 5   while(ch<0||ch>9){if(ch==-)f=-1;ch=getchar();}
 6   while(ch>=0&&ch<=9){x=x*10+ch-0;ch=getchar();}
 7   return x*f;
 8 }
 9 char s[120];
10 int f[120][120];
11 #define inf 1e9
12 bool judge(int l,int k,int r){
13   int tmp=0;
14   for(int i=k+1;i<=r;i++){
15     if(s[l+tmp]!=s[i])return 0;
16     tmp=tmp+1%(k-l+1);
17   }
18   return 1;
19 }
20 int calc(int x){
21   int tmp=0;
22   while(x){
23     tmp++;x/=10;
24   }
25   return tmp;
26 }
27 int dp(int l,int r){
28   if(l==r)return 1;
29   if(f[l][r])return f[l][r];
30   int t=r-l+1;
31   for(int k=l;k<r;k++)t=min(t,dp(l,k)+dp(k+1,r));
32   for(int k=l;k<r;k++)if((r-l+1)%(k-l+1)==0&&judge(l,k,r))t=min(t,2+dp(l,k)+calc((r-l+1)/(k-l+1)));
33   return f[l][r]=t;
34 }
35 int main(){
36   scanf("%s",s);
37   int l=strlen(s);
38   printf("%d\n",dp(0,l-1));
39   return 0;
40 }
41 
View Code

 

1090: [SCOI2003]字符串折叠

Time Limit: 10 Sec  Memory Limit: 162 MB
Submit: 1046  Solved: 680
[Submit][Status][Discuss]

Description

折叠的定义如下: 1. 一个字符串可以看成它自身的折叠。记作S ? S 2. X(S)是X(X>1)个S连接在一起的串的折叠。记作X(S) ? SSSS…S(X个S)。 3. 如果A ? A’, B?B’,则AB ? A’B’ 例如,因为3(A) = AAA, 2(B) = BB,所以3(A)C2(B) ? AAACBB,而2(3(A)C)2(B)?AAACAAACBB 给一个字符串,求它的最短折叠。例如AAAAAAAAAABABABCCD的最短折叠为:9(A)3(AB)CCD。

Input

仅一行,即字符串S,长度保证不超过100。

Output

仅一行,即最短的折叠长度。

Sample Input

NEERCYESYESYESNEERCYESYESYES

Sample Output

14

HINT

 

一个最短的折叠为:2(NEERC3(YES))

BZOJ1090: [SCOI2003]字符串折叠

标签:

原文地址:http://www.cnblogs.com/wjyi/p/5612295.html

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