ural1238. Folding(记忆化)

1238

这算模拟加记忆化吗 找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 }
View Code

 

你可能感兴趣的:(DI)