标签: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; }
标签:strlen std color cstring const ++ bre col poj
原文地址:https://www.cnblogs.com/w19567/p/11291427.html