ural1238. Folding(记忆化)
2014-02-11 13:32
183 查看
1238
这算模拟加记忆化吗 找bug找了2个多小时。。记忆化部分好想 就是字符串处理部分挫了 一个个复制模拟 各种修改查找
View Code
这算模拟加记忆化吗 找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
相关文章推荐
- URAL1501. Sense of Beauty(记忆化)
- ural1009 第一个动态规划(dp)题目 。。。似乎也可以用dfs+记忆化收索 解。。。
- URAL 1152 False Mirrors 搜索|记忆化搜索|状压
- ural 1148 记忆化搜索
- URAL 1152 False Mirrors(记忆化?搜索)
- URAL - 1828 Approximation by a Progression(最小二乘法)
- URAL 1794 Masterpieces of World Architecture
- URAL1119——DP——Metro
- 递推DP URAL 1586 Threeprime Numbers
- 记忆化搜索(DFS+DP) URAL 1501 Sense of Beauty
- Ural 1225 Flags
- hiho 1170(机器人-记忆化搜索+状态压缩)
- URAL 1025. Democracy in Danger (贪心)
- 数位类统计问题ural 1057
- URAL 1902. Neo-Venice
- 【图论】Ural 1557
- URAL 1141. RSA Attack RSA加密演算法
- 数位DP小结_记忆化搜索版
- URAL 1942 Attack at the Orbit
- URAL 1026