UVa 1630 太难了惭愧啊。

#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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值