【bzoj1068】【SCOI2007】压缩】的更多相关文章

... 1068: [SCOI2007]压缩 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 909  Solved: 566[Submit][Status][Discuss] Description 给一个由小写字母组成的字符串,我们可以用一种简单的方法来压缩其中的重复信息.压缩后的字符串除了小写字母外还可以(但不必)包含大写字母R与M,其中M标记重复串的开始,R重复从上一个M(如果当前位置左边没有M,则从串的开始算起)开始的解压结果(称为缓冲串)…
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1068 题目概括 (其实是复制的) 给一个由小写字母组成的字符串,我们可以用一种简单的方法来压缩其中的重复信息.压缩后的字符串除了小写字母外还可以(但不必)包含大写字母R与M,其中M标记重复串的开始,R重复从上一个M(如果当前位置左边没有M,则从串的开始算起)开始的解压结果(称为缓冲串). bcdcdcdcd可以压缩为bMcdRR,下面是解压缩的过程. 另一个例子是abcabcdabcabcdxy…
传送门 这题转移很妙啊. f[l][r][1/0]f[l][r][1/0]f[l][r][1/0]表示对于区间[l,r][l,r][l,r]有/无重复的机会时压缩的最小值. 那么可以从三种情况转移过来. 当前区间允许重复时,分成两段分别压缩且两段都可以重复,那么为了不使前后发生冲突中间断开时需要加一个MMM. 只压缩前面一段,后面一段不动. 如果当前区间能被分成两端一样的前面一段不压缩,后面一段重复前面的. 代码: #include<bits/stdc++.h> using namespace…
题目 给一个由小写字母组成的字符串,我们可以用一种简单的方法来压缩其中的重复信息.压缩后的字符串除了小 写字母外还可以(但不必)包含大写字母R与M,其中M标记重复串的开始,R重复从上一个M(如果当前位置左边没 有M,则从串的开始算起)开始的解压结果(称为缓冲串). bcdcdcdcd可以压缩为bMcdRR,下面是解压缩的过程 另一个例子是abcabcdabcabcdxyxyz可以被压缩为abcRdRMxyRz. 输入格式 输入仅一行,包含待压缩字符串,仅包含小写字母,长度为n. 输出格式 输出仅…
bzoj1068 洛谷P2470 区间dp入门题?只要注意到每个M“管辖”的区间互不相交即可 错误记录:有点小坑,比如aaaacaaaac最优解为aRRcR(意会坑在哪里),踩了一次 #include<cstdio> #include<algorithm> #include<cstring> #include<vector> #include<cassert> using namespace std; #define fi first #defi…
1068: [SCOI2007]压缩 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 1001  Solved: 615[Submit][Status][Discuss] Description 给一个由小写字母组成的字符串,我们可以用一种简单的方法来压缩其中的重复信息.压缩后的字符串除了小写字母外还可以(但不必)包含大写字母R与M,其中M标记重复串的开始,R重复从上一个M(如果当前位置左边没有M,则从串的开始算起)开始的解压结果(称为缓冲串). b…
1068: [SCOI2007]压缩 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 496  Solved: 315[Submit][Status] Description 给一个由小写字母组成的字符串,我们可以用一种简单的方法来压缩其中的重复信息.压缩后的字符串除了小写字母外还可以(但不必)包含大写字母R与M,其中M标记重复串的开始,R重复从上一个M(如果当前位置左边没有M,则从串的开始算起)开始的解压结果(称为缓冲串). bcdcdcdcd可以…
[BZOJ1068]压缩(动态规划) 题面 BZOJ 洛谷 题解 比较简单的\(dp\) 设\(f[i][j]\)表示当前已经匹配到了原串的第\(i\)个位置,上一个\(M\)在第\(j\)个字符之后的方案数. 每次从当前\(f[i][j]\)位置转移出去,转移只有两种. 一种是直接匹配一位,也就是\(f[i][j]->f[i+1][j]\), 另外一种是在后面添加\(R\),枚举一下后面添加几个\(R\),用\(hash\)判断插入进来是否可行就好了. 时间复杂度大概是\(O(n^2logn)…
[SCOI2007]压缩 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 1644  Solved: 1042[Submit][Status][Discuss] Description 给一个由小写字母组成的字符串,我们可以用一种简单的方法来压缩其中的重复信息.压缩后的字符串除了小写字母外还可以(但不必)包含大写字母R与M,其中M标记重复串的开始,R重复从上一个M(如果当前位置左边没有M,则从串的开始算起)开始的解压结果(称为缓冲串). bcdcdc…
[SCOI2007]压缩 状态:设\(dp[i][j]\)表示前i个字符,最后一个\(M\)放置在\(j\)位置之后的最短字串长度. 转移有三类,用刷表法来实现. 第一种是直接往压缩串后面填字符,这样就是: \[dp[i+1][j]=min(dp[i+1][j],dp[i][j]+1)\] 另外一种就是往字串里添加\(R\),要满足相邻两个字符串是匹配的,可以用字符串哈希来快速匹,另外下面的\(k\)和\(sz\)要倍增往后跳(因为重复的串长在成倍增加,题目的样例解释的很清楚了). \[dp[k…
思路:区间dp,设状态f[l][r][bo]表示区间[l,r]的答案,bo=1表示该区间可以放M也可以不放M,bo=0表示该区间不能放M,并且对于任意一个状态f,l和l-1之间均有一个M,于是就可以进行转移了. 对于区间[l,r]中的任意位置都可能要放一个M,于是当bo=1时f[l][r][bo]=min(f[l][r][bo],f[l][mid][bo]+1(即M的长度,同时为了让每个状态f前均有一个M)+f[mid+1][r][bo]) 同样也可以不放M,只考虑压缩前一段,即f[l][r][…
http://www.lydsy.com/JudgeOnline/problem.php?id=1068 Description 给一个由小写字母组成的字符串,我们可以用一种简单的方法来压缩其中的重复信息.压缩后的字符串除了小 写字母外还可以(但不必)包含大写字母R与M,其中M标记重复串的开始,R重复从上一个M(如果当前位置左边没 有M,则从串的开始算起)开始的解压结果(称为缓冲串). bcdcdcdcd可以压缩为bMcdRR,下面是解压缩的过程 另一个例子是abcabcdabcabcdxyxy…
Sol 区间DP.这个区间DP需要三维, \(f[i][j][k]\) 表示\([i,j]\) 这个区间中是否存在 \(M\) . 转移有两种,一种是这个区间存在 \(M\) ,那么直接枚举 \(M\) 的位置就可以了;另一种是没有 \(M\) ,那么从中间劈来,如果两边一样,显然是左边没有 \(M\) 的答案+1就可以了,还有种情况就是 左边压缩右边不压缩就行了. 随便加个记忆化搜索就行了,出口就是 \(L==R\) 如果 \(k==0\) 显然答案为1; \(k==1\) 不存在,赋个大数就…
Description 给 一个由小写字母组成的字符串,我们可以用一种简单的方法来压缩其中的重复信息.压缩后的字符串除了小写字母外还可以(但不必)包含大写字母R与M,其中M 标记重复串的开始,R重复从上一个M(如果当前位置左边没有M,则从串的开始算起)开始的解压结果(称为缓冲串). bcdcdcdcd可以压缩为bMcdRR,下面是解压缩的过程: 另一个例子是abcabcdabcabcdxyxyz可以被压缩为abcRdRMxyRz. Input 输入仅一行,包含待压缩字符串,仅包含小写字母,长度为…
Description 给一个由小写字母组成的字符串,我们可以用一种简单的方法来压缩其中的重复信息.压缩后的字符串除了小写字母外还可以(但不必)包含大写字母R与M,其中M标记重复串的开始,R重复从上一个M(如果当前位置左边没有M,则从串的开始算起)开始的解压结果(称为缓冲串). bcdcdcdcd可以压缩为bMcdRR,下面是解压缩的过程: 另一个例子是abcabcdabcabcdxyxyz可以被压缩为abcRdRMxyRz.Input 输入仅一行,包含待压缩字符串,仅包含小写字母,长度为n.O…
题目链接:BZOJ - 1068 题目分析 这种记忆化搜索(区间 DP) 之前就做过类似的,也是字符串压缩问题,不过这道题稍微复杂一些. 需要注意如果某一段是 S1S1 重复,那么可以变成 M + Solve(S1) + R ,不过这个 Solve(S1) 中不能在中间有 M ,否则后面的 R 向前找到的 M 就不再是开头的 M 了. 代码 #include <iostream> #include <cstdio> #include <cstring> #include…
题解: 区间DP 考虑状态的设计: \(dp[i][j][0/1]\)表示原字符串的\(i-j\)区间有无在中间加\(M\).并且默认在\(i\)之前加入\(M\)压缩后的最小长度,显然有转移: \[ dp[i][j][0]=\min_{k=i}^j(dp[i][k][0]+j-k) \] \[ dp[i][j][0]=min(dp[i][j][0],dp[i][\frac {i+j} 2 ][0]+1)\ \ (s[i\ to\ \frac {i+j} 2]==s[\frac {i+j} 2…
神仙题,看了半天题解才看明白... 因为题目里说如果没有m,会自动默认m在最前面. 我们设计状态为dp[l][r][0/1]为在区间l到r中有没有m的最小长度. 转移:枚举我们要压缩的起点,dp[l][i][1]+dp[i+1][r][1]+1,加一是指我们要压缩后半段,在断点处加上一个m. 如果我们不压缩后半段,那转移就为dp[l][i][1]+r-i,因为后面不动,就直接加上. 如果发现它可以压缩,直接dp[l][mid][0]+1,注意tag为0. Code #include<iostre…
传送门 dalao们怎么状态都设的两维以上啊?qwq 完全可以一维状态的说 设\(f[i]\)为前缀i的答案,转移就枚举从前面哪里转移过来\(f[i]=min(f[j-1]+w(j,i))(j\in [1,i])\) 现在要知道\(w(i,j)\)怎么写,也就是区间\([i,j]\)的最小长度(要求区间最多只能在开头有一个W),首先不压缩的长度就是原长度,然后压缩的话先要在开头加W,然后每次压缩一个最长的可以拆成两个相同串的前缀,压缩完后长度会加上1(后面接R),减去那个前缀的一半长度,然后那个…
Description 给一个由小写字母组成的字符串,我们可以用一种简单的方法来压缩其中的重复信息.压缩后的字符串除了小 写字母外还可以(但不必)包含大写字母R与M,其中M标记重复串的开始,R重复从上一个M(如果当前位置左边没 有M,则从串的开始算起)开始的解压结果(称为缓冲串). bcdcdcdcd可以压缩为bMcdRR,下面是解压缩的过程 另一个例子是abcabcdabcabcdxyxyz可以被压缩为abcRdRMxyRz. Input 输入仅一行,包含待压缩字符串,仅包含小写字母,长度为n…
http://www.lydsy.com/JudgeOnline/problem.php?id=1068 发现如果只设一维的话无法转移 那么我们开第二维,发现对于前i个来说,如果确定了M在哪里,第i个是用R还是不用就能确定了(如果用R那么在中间一定变成了缓冲串) 那么可以转移了 设d[i,j]表示前i个串,最近的一个M在i的前边一个格子,的最短长度,有 d[1,1]=1 d[i,i]=min{d[i-1,j]}+2 //即用一次M又补上i,所以+2 d[i,j]=d[pos,j]+1,其中pos…
压缩 #include<iostream> #include<cstring> #include<cstdio> using namespace std; #define MAXN 55 #define INF 0x3f3f3f3f #define mid ((l+r)>>1) ]; //不妨处理每个子串时,我们都在它的前面放一个M,最后答案长度-1即可 //f[l][r][0]表示子串[l,r]中除了前面的M,串中还存在其他的M的最短长度 //f[l][r…
和Luogu 4302 [SCOI2003]字符串折叠 差不多的想法,区间dp 为了计算方便,我们可以假设区间[l, r]的前面放了一个M,设$f_{i, j, 0/1}$表示区间$[i, j]$中是否存在M 因为这题只能是二的幂次倍压缩,所以转移的时候枚举中点chk是否合法,如果合法那么 $f_{i, j, 0} = f_{i, (i + j) / 2 - 1, 0} + 1$ 除了区间压缩,还可以通过加法构成最优答案 1.当中间加入了M,枚举M加入的位置 $f_{i, j, 1} = min…
神区间dp 设f[l][r][0]为在l到r中压缩的第一个字符为M,并且区间内只有这一个M,f[l][r][0]为在l到r中压缩的第一个字符为M,并且区间内有两个及以上的M 然后显然的转移是f[i][j][1]=min(f[i][k][0],f[i][k][1])+min(f[k+1][j][0],f[k+1][j][1])+1,f[i][j][0]=f[i][j][0],f[i][k][0]+j-k 然后考虑合并串,也就是当(l,mid),(mid+1,r)的串相等的时候,转移f[i][j][…
传送门 区间dp,记\(dp(l,r,t)\)表示区间\((l,r)\),\(t\)表示这个区间中能不能放\(M\).如果可以,枚举中间哪里放\(M\)来压缩.也可以不压缩,后面直接跟上去.如果左右重复的,尝试压缩一下,那么循环节里是不能放的 //minamoto #include<bits/stdc++.h> using namespace std; const int N=55,inf=0x3f3f3f3f; char s[N];int f[N][N][2],n; bool same(in…
这个题我状态想对了,但是转移错了...dp的代码难度都不大,但是思考含量太高了..不会啊,我太菜了. 其实这个题就是一个正常的区间dp,中间多了一个特判的转移就行了. 题干: Description 给一个由小写字母组成的字符串,我们可以用一种简单的方法来压缩其中的重复信息.压缩后的字符串除了小 写字母外还可以(但不必)包含大写字母R与M,其中M标记重复串的开始,R重复从上一个M(如果当前位置左边没 有M,则从串的开始算起)开始的解压结果(称为缓冲串). bcdcdcdcd可以压缩为bMcdRR…
明显是个区间dp,但是我区间dp就是个渣... f[i][j]表示区间i到j最短的字符长度:假设前面加了个M,所以初始化f[i][i]=2;当然最开始是不算M的,所以f[1][1]=1;然后就可以区间dp了.        f[i][j]=min{f[i][j-1]+1};//从上一个加一更新过来(如果不存在重合的话) if(a[i]==a[j]&&check(i,j))//判断是否有重合部分 f[i][j+j-i-1]=min(f[i][j+j-i-1],f[i][j-1]+1);//重…
题意 题目链接 Sol 神仙题Orz 考虑区间dp,如果我们只设\(f[l][r]\)表示\(s_{lr}\)被压缩的最小长度,而不去关心内部\(M\)分布的话,可能在转移的时候转移出非法状态 因此考虑多加一维表示当前子串中有没有\(M\)(默认第一个字符为\(M\)不统计在内) 转移的时候就考虑不同的\(M\)对当前区间的贡献就可以. \(P\)的作用实际上是将两个相同的字符串合成一个,拿hash判一下 复杂度\(O(n^3)\) #include<bits/stdc++.h> #defin…
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1071 题意概括 有两个序列a[1..n], b[1..n],其编号为1..n,设为s序列.现在我们要求出最长的满足条件的s的子序列s',设va=min(a[s[i]]), vb=min(b[s[i]]), 满足对于所有的j=s'[i], A*(a[j]-va)+B*(b[j]-vb)<=C. 题解 设v[i]=A*a[i]+B*b[i]; 那么,要求满足v[s'[i]]-A*va-B*vb<=…
区间DP复习 (难度排序:(A,B),(F,G,E,D,H,I,K),(C),(J,L)) 这是一个基本全在bzoj上的复习专题 没有什么可以说的,都是一些基本的dp思想 A [BZOJ1996] [Hnoi2010] chorus 合唱队 裸题 \(dp[i][j][2]\)表示区间\(i,j\)最后放的是\(i\)还是\(j\)的方案数 int n; int a[N]; ll dp[N][N][2]; int main(){ rep(i,1,n=rd()) a[i]=rd(); rep(i,…