poj2176 Folding

Posted w19567

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了poj2176 Folding相关的知识,希望对你有一定的参考价值。

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的主要内容,如果未能解决你的问题,请参考以下文章

状态压缩dp小结

zoj 2176 Speed Limit

TOJ 2176Surprising Strings

HDU 2176 取(m堆)石子游戏 博弈

P2176路障与P1186玛丽卡与P1491集合位置全面胜利

取(m堆)石子游戏 HDU2176(Nim博弈)