您的位置:首页 > 其它

ural1238. Folding(记忆化)

2014-02-11 13:32 183 查看
1238

这算模拟加记忆化吗 找bug找了2个多小时。。记忆化部分好想 就是字符串处理部分挫了 一个个复制模拟 各种修改查找

#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<stdlib.h>
#include<vector>
using namespace std;
#define INF 0xfffffff
int dp[110][110],o[110][110];
char s[110][110][110],ss[110];
int len(int x)
{
int q=0;
while(x)
{
q++;x/=10;
}
return q;
}
int dfs(int x,int y)
{
if(dp[x][y]!=INF) return dp[x][y];
if(x==y)
{
s[x][y][0] = ss[x];
s[x][y][1] = '\0';
o[x][y] = 1;
return dp[x][y] = 1;
}
int i,j,flag,k;
for(i = x ; i < y ; i++)
{
dp[x][i] = dfs(x,i);
dp[i+1][y] = dfs(i+1,y);
flag = 0;
k = INF;
if(strcmp(s[x][i],s[i+1][y])==0)
{
int t = 0;
if(o[x][i]+o[i+1][y]>1)
t+=2;
t+=len(o[x][i]+o[i+1][y]);
k = strlen(s[x][i])+t;flag = 1;
}
if(dp[x][i]+dp[i+1][y]<k)
{
k = dp[x][i]+dp[i+1][y];//cout<<s[x][i]<<" "<<s[i+1][y]<<" "<<" "<<i+1<<" "<<y<<" "<<dp[x][y]<<endl;
}
if(dp[x][y]<=k&&!flag) continue;
if(dp[x][y]>=k)
{
dp[x][y] = k;
if(!flag)
{
int g = 0,q=0;
int k1 = strlen(s[x][i]);
if(o[x][i]<=3&&k1==1)
{
for(j = 1; j <= o[x][i]; j++)
s[x][y][g++] = s[x][i][0];
}
else if(o[x][i]<=2&&k1==2)
{
for(j = 1; j <= o[x][i] ; j++)
{
s[x][y][g++] = s[x][i][0];
s[x][y][g++] = s[x][i][1];
}
}
else
{
if(o[x][i]>1)
{
int qq = o[x][i],a[10],t=0;
while(qq)
{
a[t++] = qq%10;
qq/=10;
}
for(j = t-1 ; j >= 0 ; j--)
s[x][y][g++] = a[j]+'0';
s[x][y][g++] = '(';
q = 1;
}
for(j = 0 ; j < k1;j++)
s[x][y][g++] = s[x][i][j];
if(q)
s[x][y][g++] = ')';
}
k1 = strlen(s[i+1][y]);q=0;
if(o[i+1][y]<=3&&k1==1)
{
for(j = 1; j <= o[i+1][y]; j++)
s[x][y][g++] = s[i+1][y][0];
}
else if(o[i+1][y]<=2&&k1==2)
{
for(j = 1; j <= o[i+1][y] ; j++)
{
s[x][y][g++] = s[i+1][y][0];
s[x][y][g++] = s[i+1][y][1];
}
}
else
{
if(o[i+1][y]>1)
{
int qq = o[i+1][y],a[10],t=0;
while(qq)
{
a[t++] = qq%10;
qq/=10;
}
for(j = t-1 ; j >= 0 ; j--)
s[x][y][g++] = a[j]+'0';
s[x][y][g++] = '(';
q = 1;
}
for(j = 0 ; j < k1;j++)
s[x][y][g++] = s[i+1][y][j];
if(q)
s[x][y][g++] = ')';
}
o[x][y] = 1;
s[x][y][g] = '\0';
}
else
{
strcpy(s[x][y],s[x][i]);
//cout<<s[x][y]<<" "<<x<<" "<<y<<endl;
o[x][y] = o[x][i]+o[i+1][y];
}
}
}
return dp[x][y];
}
int main()
{
int i,j,k;
for(i =0  ;i <= 100 ; i++)
for(j =0  ;j <= 100 ; j++)
dp[i][j] = INF;
cin>>ss;
k = strlen(ss);
int minz = dfs(0,k-1),q=strlen(s[0][k-1]);
//cout<<q<<endl;
if(o[0][k-1]<=3&&q==1)
for(i = 1; i <= o[0][k-1] ; i++)
cout<<s[0][k-1][0];
else if(o[0][k-1]<=2&&q==2)
for(i = 1 ; i <= o[0][k-1] ; i++)
{
cout<<s[0][k-1][0]<<s[0][k-1][1];
}
else
{
if(o[0][k-1]>1)
cout<<o[0][k-1]<<'(';
for(i = 0 ; i < q ; i++)
cout<<s[0][k-1][i];
if(o[0][k-1]>1)
cout<<')';
}
puts("");
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: