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