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

poj2176 Folding

时间:2019-08-02 22:52:00      阅读:100      评论:0      收藏:0      [点我收藏+]

标签:strlen   std   color   cstring   const   ++   bre   col   poj   

http://poj.org/problem?id=2176

 

区间dp,暴力处理相同的一段

 

#include<iostream>
#include<cstdio>
#include<vector>
#include<cstring>
using namespace std;
const int N=105;
char s[N];
vector<int> ys[N];
int n,f[N][N],pre[N][N];
int pos(int x)
{
    if(x<=9) return 1;
    if(x<=99) return 2;
    return 3;
}
int solve(int l,int r)
{
    int len=r-l+1;
    int mx=0x3f3f3f,ret;
    for(int i=ys[len].size()-1;i>=0;--i)
    {
        bool flag=1;
        for(int j=2;j<=ys[len][i];++j)
            for(int k=l+(j-1)*(len/ys[len][i]);k<=l+j*(len/ys[len][i])-1;++k)
                if(s[k]!=s[k-(len/ys[len][i])]) {flag=0;break;}
        int tmp=f[l][l+len/ys[len][i]-1]+pos(ys[len][i])+2;
        if(flag && tmp<mx) mx=tmp,ret=ys[len][i];
    }
    return ret;
}
void print(int l,int r)
{
    int len=r-l+1;
    if(pre[l][r]==0) {
        for(int i=l;i<=r;++i) putchar(s[i]);
        return;
    }
    if(pre[l][r]>0) {
        print(l,pre[l][r]);
        print(pre[l][r]+1,r);
    }
    if(pre[l][r]<0) {
        printf("%d(",-pre[l][r]);
        print(l,l-len/pre[l][r]-1);
        putchar());
    }
}
int main()
{
while(scanf("%s",s+1)!=-1)
{    
    n=strlen(s+1);
    for(int i=1;i<=n;++i)
        for(int j=i;j<=n;++j)
            f[i][j]=j-i+1;
    for(int i=1;i<=n;++i) ys[i].clear();
    for(int i=1;i<=n;++i)
        for(int j=1;i*j<=n;++j)
            ys[i*j].push_back(i);
    for(int i=2;i<=n;++i)
        for(int j=1;i+j-1<=n;++j)
        {
            int l=j,r=i+j-1;
            for(int k=l;k<r;++k)
            if(f[l][k]+f[k+1][r]<f[l][r])
            {
                f[l][r]=f[l][k]+f[k+1][r];
                pre[l][r]=k;
            }
            int tmp=solve(l,r);
            if(f[l][l+i/tmp-1]+2+pos(tmp)<f[l][r])
                f[l][r]=f[l][l+i/tmp-1]+2+pos(tmp),pre[l][r]=-tmp;
        }
    print(1,n);
    puts("");
}
    return 0;
}

 

poj2176 Folding

标签:strlen   std   color   cstring   const   ++   bre   col   poj   

原文地址:https://www.cnblogs.com/w19567/p/11291427.html

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