折叠的定义如下: 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。
标签:
...
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
折叠的定义如下: 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。
仅一行,即字符串S,长度保证不超过100。
仅一行,即最短的折叠长度。
一个最短的折叠为:2(NEERC3(YES))
标签:
原文地址:http://www.cnblogs.com/wjyi/p/5612295.html