2 条题解
-
0
#include <bits/stdc++.h> using namespace std; char ch[110]; int dp[110][110],a,b,k[110][110],cut[110][110]; bool check(int l,int r,int len); int ws(int n); void dfs(int l,int r); int main(){ while(scanf("%s",ch+1)!=EOF){ a=strlen(ch+1); memset(dp,0,sizeof(dp)); memset(k,0,sizeof(k)); memset(cut,0,sizeof(cut)); for(int len=1;len<=a;len++){ for(int l=1;l+len-1<=a;l++){ int r=l+len-1; dp[l][r]=len; for(int i=l;i<=r;i++){ if(dp[l][r]>dp[l][i]+dp[i+1][r]){ k[l][r]=0; dp[l][r]=dp[l][i]+dp[i+1][r]; cut[l][r]=i+1; } int llen=i-l+1; for(int ys=1;ys<=sqrt(llen);ys++){ if(llen%ys) continue; if(check(l,i,ys)){ if(dp[l][r]>ws(llen/ys)+2+dp[l][l+ys-1]+dp[i+1][r]){ k[l][r]=llen/ys,cut[l][r]=l+llen/ys; dp[l][r]=ws(llen/ys)+2+dp[l][l+ys-1]+dp[i+1][r]; } } if(check(l,i,llen/ys)){ if(dp[l][r]>ws(ys)+2+dp[l][l+llen/ys-1]+dp[i+1][r]){ k[l][r]=ys,cut[l][r]=l+llen/ys; dp[l][r]=ws(ys)+2+dp[l][l+llen/ys-1]+dp[i+1][r]; } } } } } } dfs(1,a); putchar('\n'); } return 0; } bool check(int l,int r,int len){ for(int i=l;i+len<=r;i++){ if(ch[i]!=ch[i+len]) return false; } return true; } int ws(int n){ int ans=0; while(n) ans++,n/=10; return ans; } void dfs(int l,int r){ if(k[l][r]){//如果有一个倍数 cout << k[l][r] << "(";//先输出倍数和一半括号 int rr=l+(r-l+1)/k[l][r]-1; dfs(l,rr);//只用递归它的循环节 cout << ")" ;//输出另外一半括号 return ; } if(!k[l][r]&&!cut[l][r]){//既没有断点又没有倍数,要直接输出 for(int i=l;i<=r;i++) cout << ch[i]; return ; } dfs(l,cut[l][r]-1);//其他一半一半继续 dfs(cut[l][r],r); return ; } -
0
#include<bits/stdc++.h> using namespace std; char ch[110]; int dp[110][110],a,b,k[110][110],cut[110][110]; bool check(int l,int r,int len); int ws(int n); void dfs(int l,int r); int main(){ while(scanf("%s",ch+1)!=EOF){ a=strlen(ch+1); memset(dp,0,sizeof(dp)); memset(k,0,sizeof(k)); memset(cut,0,sizeof(cut)); for(int len=1;len<=a;len++){ for(int l=1;l+len-1<=a;l++){ int r=l+len-1; dp[l][r]=len; for(int i=l;i<=r;i++){ if(dp[l][r]>dp[l][i]+dp[i+1][r]){ k[l][r]=0; dp[l][r]=dp[l][i]+dp[i+1][r]; cut[l][r]=i+1; } int llen=i-l+1; for(int ys=1;ys<=sqrt(llen);ys++){ if(llen%ys) continue; if(check(l,i,ys)){ if(dp[l][r]>ws(llen/ys)+2+dp[l][l+ys-1]+dp[i+1][r]){ k[l][r]=llen/ys,cut[l][r]=l+llen/ys; dp[l][r]=ws(llen/ys)+2+dp[l][l+ys-1]+dp[i+1][r]; } } if(check(l,i,llen/ys)){ if(dp[l][r]>ws(ys)+2+dp[l][l+llen/ys-1]+dp[i+1][r]){ k[l][r]=ys,cut[l][r]=l+llen/ys; dp[l][r]=ws(ys)+2+dp[l][l+llen/ys-1]+dp[i+1][r]; } } } } } } dfs(1,a); putchar('\n'); } return 0; } bool check(int l,int r,int len){ for(int i=l;i+len<=r;i++){ if(ch[i]!=ch[i+len]) return False; } return True; } int ws(int n){ int ans=0; while(n) ans++,n/=10; return ans; } void dfs(int l,int r){ if(k[l][r]){//如果有一个倍数 cout<<k[l][r]<<"(";//先输出倍数和一半括号 int rr=l+(r-l+1)/k[l][r]-1; dfs(l,rr);//只用递归它的循环节 cout<<")";//输出另外一半括号 return ; } if(!k[l][r]&&!cut[l][r]){//既没有断点又没有倍数,要直接输出 for(int i=l;i<=r;i++) cout<<ch[i]; return ; } dfs(l,cut[l][r]-1);//其他一半一半继续 dfs(cut[l][r],r); return ; }
- 1
信息
- ID
- 1406
- 时间
- 1000ms
- 内存
- 512MiB
- 难度
- 6
- 标签
- 递交数
- 17
- 已通过
- 11
- 上传者