题目描述

折叠的定义如下:

  1. 一个字符串可以看成它自身的折叠。记作S = S
  2. X(S)是X(X>1)个S连接在一起的串的折叠。记作X(S) = SSSS…S(X个S)。
  3. 如果A = A’, B = B’,则AB = A’B’ 例如,因为3(A) = AAA, 2(B) = BB,所以3(A)C2(B) = AAACBB,而2(3(A)C)2(B) = AAACAAACBB

    给一个字符串,求它的最短折叠。例如AAAAAAAAAABABABCCD的最短折叠为:9(A)3(AB)CCD。

输入输出格式

输入格式:

仅一行,即字符串S,长度保证不超过100。

输出格式:

仅一行,即最短的折叠长度。

输入输出样例

输入样例#1:

NEERCYESYESYESNEERCYESYESYES
输出样例#1:

14

说明

一个最短的折叠为:2(NEERC3(YES))

Solution:

  本题考试时没搞出来。(话说老余$AK$了!,自己还是个蒟蒻'!`~`!`)

  就是一个区间$DP$,我这里用记忆化搜索来实现。

  巧妙运用一下字符串$string$类型。定义状态$f[i][j]$表示区间$[i,j]$折叠后的最短字符串,那么当$l==r$时,显然$f[l][r]==s[l]$,搜索时枚举断点递归,找到使原串折叠后的长度最短的断点,然后枚举折叠的长度,这里用到了$stringstream$(字符串输入输出流)定义中间变量$op$,这样就可以简单的进行字符串的赋值,每一次$f[l][r]$赋为$f[l][r],op$中长度最短的一个(代码中的$op.tellp()$返回的是当前$put$流指针的位置(类似的还有$tellg$,返回$get$流指针的位置),可以理解为$op$的尾指针位置,即它的长度)。

  这样写的好处是简洁而且能简单输出折叠后的字符串(一模一样的题,只是输出的是字符串,洛谷搜:$UVA1630\;Folding$,$STL$大法好!)。

  此时先为不会$stringstream$的小伙伴们,安利一波(我测试的代码):

#include<iostream>
#include<sstream> //stringstream所需的头文件
using namespace std;
int main(){
ios::sync_with_stdio(); //取消流同步是可以用的,完全和string输入输出流无关 stringstream op; //定义string输入输出流,任意变量和string互转
string p;
char s[]={"lalalavan"};
op<<s; //将char类型的字符串赋值给op
op>>p; //将op输出到p中
cout<<op.str()<<endl<<p<<endl; //两种输出方式 op.str("");
op.clear(); //对op清空必须两个都要用,可以自行尝试去掉一个,会出兮兮`~` string num="";
int n;
op<<num;op>>n; //将string类型转为int类型
cout<<n<<endl; //输出转换后的int类型
return ;
}

本题代码:

#include<bits/stdc++.h>
#define il inline
#define For(i,a,b) for(int (i)=(a);(i)<=(b);(i)++)
#define Min(a,b) ((a)>(b)?(b):(a))
#define INF 23333
using namespace std;
int n;
string s,f[][];
il int check(int l,int r){
int sl=r-l+;
For(k,,sl>>){
if(sl%k)continue;
bool f=;
For(i,l,r-k){
if(s[i]==s[i+k])continue;
f=;
break;
}
if(f)return k;
}
return ;
}
il string dfs(int l,int r){
if(!f[l][r].empty())return f[l][r];
if(l==r)return f[l][r]=s[l];
int mink,ansl=INF;
For(i,l,r-){
int len=dfs(l,i).size()+dfs(i+,r).size();
if(len<ansl)mink=i,ansl=len;
}
f[l][r]+=dfs(l,mink),f[l][r]+=dfs(mink+,r);
int k=check(l,r);
if(k){
stringstream op; //定义输入输出流
op<<(r-l+)/k<<"("<<dfs(l,l+k-)<<")"; //将后面一大串依次赋给op
if(op.tellp()<f[l][r].size()) op>>f[l][r]; //比较f[l][r]和op取长度最小的
}
return f[l][r];
}
int main(){
cin>>s;
n=s.size();
For(i,,n-) For(j,,n-)f[i][j].clear();
cout<<dfs(,n-).size();
return ;
}

P4302 [SCOI2003]字符串折叠的更多相关文章

  1. luogu P4302 [SCOI2003]字符串折叠

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

  2. 洛谷P4302 [SCOI2003]字符串折叠(区间dp)

    题意 题目链接 Sol 裸的区间dp. 转移的时候枚举一下断点.然后判断一下区间内的字符串是否循环即可 `cpp #include<bits/stdc++.h> #define Pair ...

  3. [SCOI2003]字符串折叠(区间dp)

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

  4. BZOJ1090: [SCOI2003]字符串折叠

    区间dp. 一种是分段dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j]); 一种是这一段可以缩写dp[i][j]=min(dp[i][j],dp[i][l]+2+ca ...

  5. BZOJ 1090: [SCOI2003]字符串折叠 区间DP

    1090: [SCOI2003]字符串折叠 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/p ...

  6. 【BZOJ1090】[SCOI2003]字符串折叠(动态规划)

    [BZOJ1090][SCOI2003]字符串折叠(动态规划) 题面 BZOJ 洛谷 题解 区间\(dp\).设\(f[i][j]\)表示压缩\([i,j]\)区间的最小长度.显然可以枚举端点转移.再 ...

  7. 【bzoj1090】 [SCOI2003]字符串折叠

    [bzoj1090] [SCOI2003]字符串折叠 2014年3月9日3,1140 Description 折叠的定义如下: 1. 一个字符串可以看成它自身的折叠.记作S  S 2. X(S)是X ...

  8. [bzoj1090][SCOI2003]字符串折叠_区间dp

    字符串折叠 bzoj-1090 SCOI-2003 题目大意:我说不明白...链接 注释:自己看 想法:动态规划 状态:dp[i][j]表示从第i个字符到第j个字符折叠后的最短长度. 转移:dp[l] ...

  9. bzoj 1090 [SCOI2003]字符串折叠(区间DP)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1090 [题意] 给定一个字符串,问将字符串折叠后的最小长度. [思路] 设f[i][j ...

随机推荐

  1. 管道命令'|' 和xargs find命令找到后把所有找到的删除

    管道符号,是unix功能强大的一个地方,符号是一条竖线:"|", 用法: command 1 | command 2 他的功能是把第一个命令command 1执行的结果作为comm ...

  2. 多GPU设备处理点积示例

    多GPU设备处理点积示例,项目打包下载 /* * Copyright 1993-2010 NVIDIA Corporation. All rights reserved. * * NVIDIA Cor ...

  3. python换行

    python中如果一行代码太长,看着不方便时,怎么办? 只需要在需要换行的地方添加上符号 \ 就行了.

  4. PHP递归排序怎么实现的?

    递归算法对于任何一个编程人员来说,应该都不陌生.因为递归这个概念,无论是在PHP语言还是Java等其他编程语言中,都是大多数算法的灵魂.   对于PHP新手来说,递归算法的实现原理可能不容易理解.但是 ...

  5. Python知识点入门笔记——特色数据类型(集合)

    集合是一种不重复的无序集 集合用花括号来定义{} 集合和字典一样,里面的顺序是无序的,{1,2,3}和{3,2,1}是相等的 集合的元素不可重复,也就是说{1,2,2,3}是不存在的,应该写为{1,2 ...

  6. django之media配置

    一.没有配置Media avatar = models.FileField(upload_to='avatars/', default='/avatars/default.png') # 储存头像的m ...

  7. POJ 3320 尺取法(基础题)

    Jessica's Reading Problem Description Jessica's a very lovely girl wooed by lots of boys. Recently s ...

  8. 动态规划:HDU-1203-0-1背包问题:I NEED A OFFER!

    解题心得: 动态规划就是找到状态转移方程式,但是就本题0-1背包问题来说转移方程式很简单,几乎看模板就行了. 在本题来说WA了很多次,很郁闷,因为我记录v[i]的时候i是从0开始的,一些特殊数据就很尴 ...

  9. f触发器、存储过程

    drop trigger trig_insert--删除触发器

  10. git 使用规范

    git使用资料: https://github.com/peak-c/my-git 公司内部使用开发规范: 一. 代码库介绍 个人开发库(git@gitlab.adrd.sohuno.com:sper ...