区间dp,记忆化搜就可以

st为原串

dp[p][q]存st[p]~st[q]的最优长度,f[p][q]存对应的最优串

从(0,len-1)开始搜,f[0][len-1]为所求ans,回溯条件为p==q

同前两个题思路极为类似,但是我发现这3个题放到一起真的非常的好,难度递进,依次难在地方就是状态转移的时候决策的寻找

而此题的决策不是很明确,可以理解为两个决策吧(大家都这么认为= =但我不怎么赞同)

1:当子串st[p~q]可以折叠

2:将st[p~q]分成两段

二者中取最短

(其实第二个决策隐藏了一个决策,举个例子,原串AA,而压缩成2(A)显然是不对的,根据第二个决策,dp[AA]=dp[A]+dp[A]=2优于决策1)

自己coding时遇到一个问题:

NTTTTTNTTTTTNTTTTT

根据决策2,会得到一种情况f[0][len-1]=2(N5(T))N5(T),怎么折叠成3(N5(T));

若是根据决策1,那得到的结果会是3(NTTTTT);

特殊处理嵌套会非常麻烦

解决方法详见代码

观察了网上其他人的代码,学到了不少东西

coding+debug:差不多断断续续5个小时左右(但是这5个小时是比较值的,记忆化dp或者说区间dp这一方面我理解的更具体,更深刻了)

/*
* Author: Bingo
* Created Time: 2015/3/3 14:19:57
* File Name: uva1630.cpp
*/
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <string>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <time.h>
using namespace std;
const int maxint = ;
int n;
int len;
string st;
int dp[][];
string f[][];//一层状态对应一个串
int judge(int l,int r){
for(int i=;i<=(r-l+)/;i++){
if((r-l+)%i)continue;
bool flag=true;
for(int j=l;j+i<=r;j++){
if(st[j]!=st[j+i]){
flag=false;
break;
}
}
if(flag)return i;
}
return false;
}
int solve(int p,int q){
if (dp[p][q]) return dp[p][q];
else if(p==q) {
f[p][q]=st[p];
dp[p][q]=;
return ;
}
else {
int ans=maxint;
int res;
int k;
for (int i=p;i<q;i++){
res=solve(p,i)+solve(i+,q);
if (ans>res){
ans=res;
k=i;
}
}
f[p][q]=f[p][k]+f[k+][q];//此时的f[p][q]是否可折叠等价于st[p] [q]是否可折叠,巧妙的解决折叠f[p][q]时提取公因式的困难
int t=judge(p,q);
if (t){
char tt[];
sprintf(tt,"%d",(q-p+)/t);
string newstr=tt+string("(")+f[p][p+t-]+string(")");//f[p][p+t-1]是精髓所在
if (newstr.size()<f[p][q].size()) f[p][q]=newstr;
}
dp[p][q]=f[p][q].size();
return dp[p][q];
}
}
int main () {
while (cin>>st){
len=st.size();
memset(dp,,sizeof(dp));
solve(,len-);
cout << f[][len-]<<endl;
}
return ;
}

UVa1630,Folding的更多相关文章

  1. UVA1630 Folding 区间DP

    Folding Description   Bill is trying to compactly represent sequences of capital alphabetic characte ...

  2. 洛谷 4302 BZOJ 1090 SCOI2003 字符串折叠 UVA1630 Folding(输出方案版)

    [题解] 区间DP.  设f[i][j]表示i~j的最小代价.再枚举中间点k,很容易想到转移方程为f[i][j]=min(f[i][j],f[i][k]+f[k][j]),同时如果i~k可以通过重复获 ...

  3. P4302 [SCOI2003]字符串折叠

    题目描述 折叠的定义如下: 一个字符串可以看成它自身的折叠.记作S = S X(S)是X(X>1)个S连接在一起的串的折叠.记作X(S) = SSSS…S(X个S). 如果A = A’, B = ...

  4. Codeforces Gym 100002 Problem F "Folding" 区间DP

    Problem F "Folding" Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/ ...

  5. eclipse 插件之Code Folding

    功能: eclipse自带折叠包括方法, import, 注释等得折叠功能, code folding 插件对其增强. 1. 下载插件:( 也可以用link方式, 我的是link安装, jar包网上很 ...

  6. Android Folding View(折叠视图、控件)

    版本号:1.0 日期:2014.4.21 版权:© 2014 kince 转载注明出处 非常早之前看过有人求助以下这个效果是怎样实现的,   也就是側滑菜单的一个折叠效果,事实上关于这个效果的实现,谷 ...

  7. Chrome Dev Tools: Code Folding in CSS and Javascript for improved code readiability

    Note : Apply for google chrome canary. You can fold code blocks in CSS (and Sass) and javascript fil ...

  8. Codeforces Round #397 by Kaspersky Lab and Barcelona Bootcamp (Div. 1 + Div. 2 combined) E. Tree Folding 拓扑排序

    E. Tree Folding 题目连接: http://codeforces.com/contest/765/problem/E Description Vanya wants to minimiz ...

  9. Eclipse折叠代码 coffee bytes code folding

    提供一个插件下载地址,博客园的: http://files.cnblogs.com/wucg/com.cb.eclipse.folding_1.0.6.jar.zip  将下载的zip文件解压出来的j ...

随机推荐

  1. 201521123110《Java程序设计》第12周学习总结

    1. 本周学习总结 2. 书面作业 1. 字符流与文本文件:使用 PrintWriter(写),BufferedReader(读) 1.1 生成的三个学生对象,使用PrintWriter的printl ...

  2. 201521123031 《Java程序设计》第13周学习总结

    1. 本周学习总结 以你喜欢的方式(思维导图.OneNote或其他)归纳总结多网络相关内容. 2. 书面作业 1. 网络基础 1.1 比较ping www.baidu.com与ping cec.jmu ...

  3. SharePoint备份文件

    stp文件:SharePoint的.stp文件   在做一个和SharePoint有关的项目时,由于对SharePoint的unfamiliar,所以客户发了几个后缀为.stp的文件将我纳闷了半天,不 ...

  4. 【DDD】业务建模实践 —— 删除帖子

    本文是基于上一篇‘业务建模战术’的实践,主要讲解‘删除帖子’场景的业务建模,包括:业务建模.业务模型.示例代码:示例代码会使用java编写,文末附有github地址.相比于<领域驱动设计> ...

  5. MySQL的JOIN(五):JOIN优化实践之排序

    这篇博文讲述如何优化JOIN查询带有排序的情况.大致分为对连接属性排序和对非连接属性排序两种情况.插入测试数据. CREATE TABLE t1 ( id INT PRIMARY KEY AUTO_I ...

  6. 为bookStore添加权限【动态代理和注解】

    前言 目前为止,我们已经学习了动态代理技术和注解技术了.于是我们想要为之前的bookStore项目添加权限控制-.. 只有用户有权限的时候,后台管理才可以进行相对应的操作-.. 实现思路 之前我们做权 ...

  7. Java main方法继承

    java中main方法是可以继承的 Test1.java package Variables; public class Test1 { public static void main(String[ ...

  8. Javascript跳转页面和打开新窗口等方法

    1.在原来的窗体中直接跳转用onClick="window.location.href='你所要跳转的页面';" 2.在新窗体中打开页面用:onclick="window ...

  9. JSP-页面跳转大全

    转自:http://blog.sina.com.cn/s/blog_8c38b8b701013zzz.html (1). forward()方法 使用到javax.servlet.RequestDis ...

  10. Data_Struct(LinkList)

    最近在学数据结构,学到链表这节作业有链表,毕竟菜鸟代码基本照看书上算法写的,再加上自己的小修改,这里先记录下来,万一哪天想看了,来看看. 里面有用到二级指针,还是不太理解,还有就是注释不多,后续有了更 ...