#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
const int INF=0x3f3f3f3f;
const int maxn=200;
int n;
string a;
int d[maxn][maxn];
string b[maxn][maxn];//折叠后的串的样子
int judge(int l,int r)
{
for(int i=1;i<=(r-l+1)/2;i++)//i为可能重复的长度值
{
if((r-l+1)%i) continue;
bool flag=true;
for(int j=l;j+i<=r;j++)
{
if(a[j]!=a[j+i])
{
flag=false;
break;
}
}
if(flag) return i;//返回重复的长度值
}
return false;//否则不重复返回了0
}
int DP(int l,int r)
{
if(d[l][r]!=-1)
return d[l][r];
if(l==r)
{
d[l][r]=1;
b[l][r]=a[l];
return 1;
}
int k;
int re=INF;
for(int i=l;i<r;i++)
{
int temp=DP(l,i)+DP(i+1,r);
if(temp<re)
{
k=i;
re=temp;
}
}
b[l][r]=b[l][k]+b[k+1][r];//体现了用string的方便啊
int lens=judge(l,r);//判断重复与否以及重复的个数
if(lens)
{
bool t=true;
for(int i=l;i<=r;i++)
{
if(a[i]=='('||a[i]==')')
t=false;
}
char c[10];
sprintf(c,"%d",(r-l+1)/lens);//(r-l+1)/lens得到重复该长度值的重复次数
string news=c+string("(")+b[l][l+lens-1]+string(")");
if(t&&news.size()<re)
{
re=news.size();
b[l][r]=news;
}
}
d[l][r]=re;
return re;
}
int main()
{
while(cin>>a)
{
int len=a.size();
memset(d,-1,sizeof(d));
DP(0,len-1);
cout<<b[0][len-1]<<endl;
}
return 0;
}
太难了 ,惭愧啊。参考 http://blog.csdn.net/a197p/article/details/48701227
UVa 1630 太难了惭愧啊。
最新推荐文章于 2020-11-29 20:24:21 发布