一眼区间\(dp\),但蒟蒻的我还是调了好久\(qwq\)

【状态设置】

设\(f[i][j]\)为子串\([i,j]\)的最短折叠

目标为\(f[1][n]\)

【初始化】

\(1\) 首先对于任意的\(i\)必然存在\(f[i][i]=1\)

然后其他的都初始化为\(INF\)即可

\(2\) 因为最后的字符串可能会出现数字,所以不妨考虑用一个数组\(g[x]\)预处理\(x\)的位数\(qwq\)

【\(dp\)核心】

对于任意的\(f[i][j]\) \((i < j)\)可以有两种得到方式。

  • 分成两段,两段的最短折叠连在一起构成,即左区间\(+\)右区间

  • 自身构成:找子串\([i,j]\)中的一个循环子串,形如 循环节 左括号 子串 右括号。长度即为即循环节位数\(+2+\)子串长度。

第一种方式,套区间\(dp\)的模板,先枚举出\(len\)和\(i\),得到\(j=i+len-1\),再跑一遍\(k\)枚举割点,于是得到:

\[f[i][j]=min(f[i][j],f[i][k]+f[k+1][j])
\]

\[i \leq k < j
\]

第二种方式,如果子串\([i,k]\)是子串\([i,j]\)中的一个循环子串,则:

\[f[i][j]=min(f[i][j],g[len/l]+2+f[i][k])
\]

\[l=k-i+1
\]

【代码】

#include<bits/stdc++.h>
using namespace std;
const int max_n=100+5;
int n,g[max_n],f[max_n][max_n];
string st;
bool check(int ll,int rr,int len){//判断是否是循环节
for(int i=ll;i<=ll+len-1;i++){
char ch=st[i];
for(int j=i;j<=rr;j+=len){
if(st[j]!=ch)return false;
}
}
return true;
}
int main(){
ios::sync_with_stdio(false);
cin>>st;
n=st.size();st=" "+st;//把字符串变成1~n
for(int i=1;i<=9;i++)g[i]=1;
for(int i=10;i<=99;i++)g[i]=2;
g[100]=3;//g[x]表示x的位数
memset(f,0x3f,sizeof(f));
for(int i=1;i<=n;i++)f[i][i]=1;//初始化f数组
for(int len=1;len<=n;len++){
for(int i=1;i+len-1<=n;i++){
int j=i+len-1;//区间DP模板,得到i和j
for(int k=i;k<j;k++){//枚举哪里切
f[i][j]=min(f[i][j],f[i][k]+f[k+1][j]);//第一种情况,左区间+右区间
int l=k-i+1;//第二种情况,先得到循环节的长度
if(len%l)continue;//长度不符
if(check(i,j,l))f[i][j]=min(f[i][j],g[len/l]+2+f[i][k]);//是循环节,那么套公式
}
}
}
cout<<f[1][n]<<"\n";
return 0;
}

\(\operatorname{Update}\) \(\operatorname{On}\) \(\operatorname{2019.08.28}\)

题解 洛谷P4302 【[SCOI2003]字符串折叠】的更多相关文章

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

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

  2. 洛谷P4302 [SCOI]字符串折叠 [字符串,区间DP]

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

  3. P4302 [SCOI2003]字符串折叠

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

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

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

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

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

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

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

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

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

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

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

  9. 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 ...

随机推荐

  1. php_mvc实现步骤十

    shop34-19-商品添加 功能:添加商品表单 Index.php?p=back&c=Goods&a=add Controller-Action: 新建商品控制器类 Applicat ...

  2. CF1260D A Game with Traps

    http://codeforces.com/problemset/problem/1260/D 首先很明显可以想到二分答案,把能力值数组排个序就好. 考虑怎么check. 设当前二分值为w,即不能直接 ...

  3. linux全面详细转载文章

    在网上发现了一位大佬写的linux各种命令.系统.配置等的详细解析,在此转载保留以便学习! 骏马金龙https://www.cnblogs.com/f-ck-need-u/p/7048359.html

  4. Python学习日记(一) String函数使用

    s = "abcaDa a" s2 = "123a abc ABCSAa s " s3 = "\tas \t\tb123" s4 = ' & ...

  5. Pair(二进制处理+数位dp)(2019牛客暑期多校训练营(第七场))

    示例: 输入: 33 4 24 5 27 8 5 输出:5 7 31 题意:存在多少对<x,y>满足x&y>C或x^y<C的条件.(0<x<=A,0< ...

  6. 如何配置php session使用redis集群

    本实例基于phpredis 2.2.8,支持集群处理,php5.3及以上. 1.页面修改: ini_set('session.save_handler', 'rediscluster'); ini_s ...

  7. [SOJ #112]Dirichlet 前缀和

    题目大意:给定一个长度为$n$的序列$a_n$,需要求出一个序列$b_n$,满足:$$b_k=\sum\limits_{i|k}a_i$$$n\leqslant10^7$ 题解:$\mathrm{Di ...

  8. 结合consul raft库理解raft

    一 入口 github.com/hashicorp/consul/agent/consul/server.go func (s *Server) setupRaft() error { 状态机,用于c ...

  9. java 堆 排序学习

    /** * <html> * <body> * <P> Copyright 1994 JsonInternational</p> * <p> ...

  10. JSP 9大隐式对象和四个作用域的范围

    Java中 九大隐式对象说明 输入/输出对象:  request   response   out 作用域通信对象: session  application  pageContext Servlet ...