• 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] = '';
     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] = '';
    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
  • 相关阅读:
    博弈论嘻嘻
    cf之kmp匹配稍稍改一改
    点分治开始!
    后缀数组
    cf之 前缀和差分
    AJAX 数据库实例
    常用jar包用途
    cxf客户端所需最少jar包
    Dbutis
    dbutils入门
  • 原文地址:https://www.cnblogs.com/shangyu/p/3544214.html
Copyright © 2020-2023  润新知