[DP记忆化 字符串] UVa1630 Folding
来源:互联网 发布:数据加密的基本功能 编辑:程序博客网 时间:2024/06/14 02:51
DP[i][j]。i,j分别表示起始位置,终止位置,数组存该段压缩后的长度。一个串的最短压缩可以有两种情况:1.其本身是重复的,压缩其本身达到最短。2.将其分为两段,两段压缩后连接达到最短。
#include<bits/stdc++.h>using namespace std;const int INF= 0x3f3f3f3f;string str;int DP[110][110];string fold[110][110];int judge(int l,int r){ //judge repeat //这里判重用的就是枚举 for(int i=1;i<=(r-l+1)/2;i++) { if((r-l+1)%i) continue; bool flag=true; for(int j=l;j+i<=r;j++) { if(str[j]!=str[j+i]) { flag=false; break; } } if(flag) return i; } return false;}int fun(int l,int r){ if(DP[l][r]!=-1) return DP[l][r]; if(l==r){ DP[l][r]=1; fold[l][r]=str[l]; return 1; } int k; int re=INF; for(int i=l;i<r;i++) { int tmp=fun(l,i)+fun(i+1,r); if(tmp < re) { k=i; re=tmp; } } fold[l][r]=fold[l][k]+fold[k+1][r]; re=fun(l,k)+fun(k+1,r); int len=judge(l,r); //对重复串的压缩 if(len){ bool test=true; for(int i=l;i<=r;i++){ if(str[i]=='('||str[i]==')') test=false; //不要把括号作为压缩对象 } char t[10]; sprintf(t,"%d",(r-l+1)/len); string newstr=t+string("(")+fold[l][l+len-1]+string(")"); if(test&&newstr.size()<re){ re=newstr.size(); fold[l][r]=newstr; } } DP[l][r]=re; return re;}int main(){ while(cin>>str){ int R=str.size()-1; memset(DP,-1,sizeof(DP)); fun(0,R); cout<<fold[0][R]<<endl; } return 0;}
1 0
- [DP记忆化 字符串] UVa1630 Folding
- UVa1630 Folding 记忆化搜索
- uva1630(dp记忆化搜索)
- UVA1630 - Folding
- 【DP 训练】Folding, ACM/ICPC NEERC 2002, UVa1630
- UVA1630[Folding] 区间动态规划
- UVa1630 Folding/poj 2176 Folding/zoj 1554 Folding
- UVA 1630 Folding——区间DP(记忆化搜索)
- rqnoj-275-FOLDING-记忆化搜索
- Folding - ZOJ 1554 dp
- csu 1510 Happy Robot(字符串DP,记忆化搜索)
- hihocoder 1323 回文字符串 区间dp OR 记忆化搜索
- uva 1630 lrj-P305 字符串dp(记忆化)
- POJ 2176 Folding (字符串)
- hdu2517 记忆化dp
- dp记忆化搜索
- 记忆化dp hdu1978
- 记忆化搜索,dp
- 关于Split()以某个字符串分割,解决特定字符串连续出现的问题
- 关于弄了一晚上linux到现在的一些事情。
- 法国人人给
- 插件开发技术说明(15)---单据处理编程模式
- Java常见问题1
- [DP记忆化 字符串] UVa1630 Folding
- leetCode---Single Number III
- Windows命令行常用命令
- 串的简单处理
- 机器学习简明手册
- 移动端点击事件触发顺序
- Excel地址转换
- DOM节点操作方法
- 手机尾号