[关闭]
@994495jj 2017-08-07T00:45:42.000000Z 字数 1061 阅读 704

cfgym100002F

201708 (ACM)动态规划----区间dp


  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define fi first
  4. #define se second
  5. #define pb push_back
  6. #define sz(a) (int)a.size()
  7. #define mp make_pair
  8. #define rep(i, a, b) for(int i=(a); i<(b); i++)
  9. #define de(a) cout<<#a<<"="<<a<<endl;
  10. typedef long long ll;
  11. typedef pair<int, int> pii;
  12. typedef vector<int> vi;
  13. //--------
  14. const int N=105;
  15. string s;
  16. string d[N][N];
  17. int fold(int l,int r) {
  18. int len=r-l+1;
  19. rep(i,1,len/2+1) {
  20. if(len%i) continue;
  21. bool f=1;
  22. rep(j,l+i,r+1) {
  23. if(s[j]!=s[j-i]) {
  24. f=0;
  25. break;
  26. }
  27. }
  28. if(f) return len/i;
  29. }
  30. return -1;
  31. }
  32. int main() {
  33. freopen("folding.in", "r", stdin);
  34. freopen("folding.out", "w", stdout);
  35. while(cin>>s) {
  36. int n=s.length();
  37. rep(len,1,n+1) {
  38. rep(i,0,n) {
  39. int j=len+i-1;
  40. if(j>=n) break;
  41. d[i][j]=s.substr(i,len);
  42. int t=fold(i,j);
  43. if(t>0) {
  44. char num[10];
  45. sprintf(num,"%d",t);
  46. if(sz(d[i][j])>(int)strlen(num)+2+len/t) {
  47. d[i][j]=string(num)+"("+d[i][i+len/t-1]+")";
  48. }
  49. } else {
  50. rep(k,i,j) {
  51. if(sz(d[i][j])>sz(d[i][k])+sz(d[k+1][j])) d[i][j]=d[i][k]+d[k+1][j];
  52. }
  53. }
  54. }
  55. }
  56. cout<<d[0][n-1]<<endl;
  57. }
  58. return 0;
  59. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注