ural1238. Folding(记忆化)
这算模拟加记忆化吗 找bug找了2个多小时。。记忆化部分好想 就是字符串处理部分挫了 一个个复制模拟 各种修改查找
1 #include <iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<stdlib.h> 6 #include<vector> 7 using namespace std; 8 #define INF 0xfffffff 9 int dp[110][110],o[110][110]; 10 char s[110][110][110],ss[110]; 11 int len(int x) 12 { 13 int q=0; 14 while(x) 15 { 16 q++;x/=10; 17 } 18 return q; 19 } 20 int dfs(int x,int y) 21 { 22 if(dp[x][y]!=INF) return dp[x][y]; 23 if(x==y) 24 { 25 s[x][y][0] = ss[x]; 26 s[x][y][1] = '\0'; 27 o[x][y] = 1; 28 return dp[x][y] = 1; 29 } 30 int i,j,flag,k; 31 for(i = x ; i < y ; i++) 32 { 33 dp[x][i] = dfs(x,i); 34 dp[i+1][y] = dfs(i+1,y); 35 flag = 0; 36 k = INF; 37 if(strcmp(s[x][i],s[i+1][y])==0) 38 { 39 int t = 0; 40 if(o[x][i]+o[i+1][y]>1) 41 t+=2; 42 t+=len(o[x][i]+o[i+1][y]); 43 k = strlen(s[x][i])+t;flag = 1; 44 } 45 if(dp[x][i]+dp[i+1][y]<k) 46 { 47 k = dp[x][i]+dp[i+1][y];//cout<<s[x][i]<<" "<<s[i+1][y]<<" "<<" "<<i+1<<" "<<y<<" "<<dp[x][y]<<endl; 48 } 49 if(dp[x][y]<=k&&!flag) continue; 50 if(dp[x][y]>=k) 51 { 52 dp[x][y] = k; 53 if(!flag) 54 { 55 int g = 0,q=0; 56 int k1 = strlen(s[x][i]); 57 if(o[x][i]<=3&&k1==1) 58 { 59 for(j = 1; j <= o[x][i]; j++) 60 s[x][y][g++] = s[x][i][0]; 61 } 62 else if(o[x][i]<=2&&k1==2) 63 { 64 for(j = 1; j <= o[x][i] ; j++) 65 { 66 s[x][y][g++] = s[x][i][0]; 67 s[x][y][g++] = s[x][i][1]; 68 } 69 } 70 else 71 { 72 if(o[x][i]>1) 73 { 74 int qq = o[x][i],a[10],t=0; 75 while(qq) 76 { 77 a[t++] = qq%10; 78 qq/=10; 79 } 80 for(j = t-1 ; j >= 0 ; j--) 81 s[x][y][g++] = a[j]+'0'; 82 s[x][y][g++] = '('; 83 q = 1; 84 } 85 for(j = 0 ; j < k1;j++) 86 s[x][y][g++] = s[x][i][j]; 87 if(q) 88 s[x][y][g++] = ')'; 89 } 90 k1 = strlen(s[i+1][y]);q=0; 91 if(o[i+1][y]<=3&&k1==1) 92 { 93 for(j = 1; j <= o[i+1][y]; j++) 94 s[x][y][g++] = s[i+1][y][0]; 95 } 96 else if(o[i+1][y]<=2&&k1==2) 97 { 98 for(j = 1; j <= o[i+1][y] ; j++) 99 { 100 s[x][y][g++] = s[i+1][y][0]; 101 s[x][y][g++] = s[i+1][y][1]; 102 } 103 } 104 else 105 { 106 if(o[i+1][y]>1) 107 { 108 int qq = o[i+1][y],a[10],t=0; 109 while(qq) 110 { 111 a[t++] = qq%10; 112 qq/=10; 113 } 114 for(j = t-1 ; j >= 0 ; j--) 115 s[x][y][g++] = a[j]+'0'; 116 s[x][y][g++] = '('; 117 q = 1; 118 } 119 for(j = 0 ; j < k1;j++) 120 s[x][y][g++] = s[i+1][y][j]; 121 if(q) 122 s[x][y][g++] = ')'; 123 } 124 o[x][y] = 1; 125 s[x][y][g] = '\0'; 126 } 127 else 128 { 129 strcpy(s[x][y],s[x][i]); 130 //cout<<s[x][y]<<" "<<x<<" "<<y<<endl; 131 o[x][y] = o[x][i]+o[i+1][y]; 132 } 133 } 134 } 135 return dp[x][y]; 136 } 137 int main() 138 { 139 int i,j,k; 140 for(i =0 ;i <= 100 ; i++) 141 for(j =0 ;j <= 100 ; j++) 142 dp[i][j] = INF; 143 cin>>ss; 144 k = strlen(ss); 145 int minz = dfs(0,k-1),q=strlen(s[0][k-1]); 146 //cout<<q<<endl; 147 if(o[0][k-1]<=3&&q==1) 148 for(i = 1; i <= o[0][k-1] ; i++) 149 cout<<s[0][k-1][0]; 150 else if(o[0][k-1]<=2&&q==2) 151 for(i = 1 ; i <= o[0][k-1] ; i++) 152 { 153 cout<<s[0][k-1][0]<<s[0][k-1][1]; 154 } 155 else 156 { 157 if(o[0][k-1]>1) 158 cout<<o[0][k-1]<<'('; 159 for(i = 0 ; i < q ; i++) 160 cout<<s[0][k-1][i]; 161 if(o[0][k-1]>1) 162 cout<<')'; 163 } 164 puts(""); 165 return 0; 166 }