好题。

显然区间 dp,令 \(f_{l, r}\) 为 \([l, r]\) 之间的最短的长度。如果我们要压缩,那么就要考虑 M 与 R 的位置。由于我们大体是从左往右来转移的,所以显然我们只需要记录一下 M,R 是可以枚举的。令 \(f_{l, r, 0/1}\) 代表 \([l, r]\) 之间有没有 M 的最短长度。

我们默认 \((l - 1)\) 的位置上有一个 M。首先我们考虑放 R。显然我们可以只在 \(r + 1\) 的位置上放 R,我们判断一下 \([l, r]\) 区间左右两端是不是一样的,如果是,则有 \(f_{l, r, 0} = \min\{f_{l, mid, 0} + 1, f_{l, r, 0}\}\)。为什么不是 \(f_{mid + 1, r, 0} + 1\)?因为这个位置没有做到。

然后我们考虑平常的操作。对于 \(f_{l, r, 0}\),枚举 \(k\) 显然是 \(f_{l, r, 0} = \min\{f_{l, r, 0}, f_{l, k, 0} + r - k\}\)。\(f_{l, r, 1}\) 就枚举 \(k\) 作为加入 M 的地方,那么就是 \(f_{l, r, 1} = \min\{f_{l, r, 1}, \min\{f_{l, k, 0}, f_{l, k, 1}\} +\min\{f_{k + 1, r, 0}, f_{k + 1, r, 1}\} + 1\}\)。

然后就酱紫,就没了。


所以你会发现这题其实一点也不难,区间 dp 很一眼,状态也不难想,转移也很符合人类的逻辑。。。

em?em。。。

所以为什么 SX 在模拟赛没有想出来,,,?????????????

SXSB

//SIXIANG
#include <iostream>
#include <cstring>
#define MAXN 1000
#define QWQ cout << "QWQ" << endl;
using namespace std;
string str;
bool check(int l, int r) {
int len = (r - l + 1);
if(len & 1) return 0;
int mid = (r + l) / 2;
for(int p = l; p <= (r + l) / 2; p++)
if(str[p] != str[++mid])
return 0;
return 1;
}
int f[MAXN + 10][MAXN + 10][2];
int main() {
memset(f, 0x3f, sizeof(f));
int n; cin >> str;
n = str.size();
str = "$" + str;//CCF loves Monny $_$
for(int p = 1; p <= n; p++)
for(int i = p; i <= n; i++)
f[p][i][0] = f[p][i][1] = i - p + 1;
for(int len = 1; len <= n; len++) {
for(int l = 1; l + len - 1 <= n; l++) {
int r = l + len - 1;
if(check(l, r)) f[l][r][0] = min(f[l][r][0], 1 + f[l][(r + l) / 2][0]);
for(int k = l; k < r; k++) f[l][r][0] = min(f[l][r][0], f[l][k][0] + r - k);
for(int k = l; k < r; k++)
f[l][r][1] = min(f[l][r][1], min(f[l][k][0], f[l][k][1]) + min(f[k + 1][r][0], f[k + 1][r][1]) + 1);
}
}
cout << min(f[1][n][0], f[1][n][1]) << endl;
}

话说这个我交到 darkbzoj 上炸了诶 qaq。

题解 [SCOI2007]压缩的更多相关文章

  1. bzoj 1068 [SCOI2007]压缩 区间dp

    [SCOI2007]压缩 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 1644  Solved: 1042[Submit][Status][Discu ...

  2. BZOJ1068: [SCOI2007]压缩

    ... 1068: [SCOI2007]压缩 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 909  Solved: 566[Submit][Statu ...

  3. bzoj 1068: [SCOI2007]压缩 DP

    1068: [SCOI2007]压缩 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 496  Solved: 315[Submit][Status] D ...

  4. [SCOI2007]压缩(动态规划,区间dp,字符串哈希)

    [SCOI2007]压缩 状态:设\(dp[i][j]\)表示前i个字符,最后一个\(M\)放置在\(j\)位置之后的最短字串长度. 转移有三类,用刷表法来实现. 第一种是直接往压缩串后面填字符,这样 ...

  5. BZOJ1068:[SCOI2007]压缩——题解

    http://www.lydsy.com/JudgeOnline/problem.php?id=1068 Description 给一个由小写字母组成的字符串,我们可以用一种简单的方法来压缩其中的重复 ...

  6. 1068: [SCOI2007]压缩

    题解: 区间DP 考虑状态的设计: \(dp[i][j][0/1]\)表示原字符串的\(i-j\)区间有无在中间加\(M\).并且默认在\(i\)之前加入\(M\)压缩后的最小长度,显然有转移: \[ ...

  7. [SCOI2007]压缩(区间dp)

    神仙题,看了半天题解才看明白... 因为题目里说如果没有m,会自动默认m在最前面. 我们设计状态为dp[l][r][0/1]为在区间l到r中有没有m的最小长度. 转移:枚举我们要压缩的起点,dp[l] ...

  8. BZOJ1068 [SCOI2007]压缩 区间动态规划 字符串

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1068 题目概括 (其实是复制的) 给一个由小写字母组成的字符串,我们可以用一种简单的方法来压缩其中 ...

  9. BZOJ1068 [SCOI2007]压缩 【区间dp】

    题目 给一个由小写字母组成的字符串,我们可以用一种简单的方法来压缩其中的重复信息.压缩后的字符串除了小 写字母外还可以(但不必)包含大写字母R与M,其中M标记重复串的开始,R重复从上一个M(如果当前位 ...

  10. BZOJ 1068: [SCOI2007]压缩

    Sol 区间DP.这个区间DP需要三维, \(f[i][j][k]\) 表示\([i,j]\) 这个区间中是否存在 \(M\) . 转移有两种,一种是这个区间存在 \(M\) ,那么直接枚举 \(M\ ...

随机推荐

  1. 【每日一题】【DFS和回溯的区别】【BFS】104. 二叉树的最大深度-211227/220218

    给定一个二叉树,找出其最大深度. 二叉树的深度为根节点到最远叶子节点的最长路径上的节点数. 说明: 叶子节点是指没有子节点的节点. 示例:给定二叉树 [3,9,20,null,null,15,7], ...

  2. python基础-常用内置包

      内置包是python自带的一些功能模块,有需求时可以在自己文件中直接导入使用. 1.datetime包   python中的时间包,可以在业务开发中辅助我们处理时间信息: # datetime可以 ...

  3. centos7安装MySql8.0.29教程

    个人名片: 对人间的热爱与歌颂,可抵岁月冗长 Github‍:念舒_C.ying CSDN主页️:念舒_C.ying 个人博客 :念舒_C.ying @ 目录 1 安装之前检测系统是否有自带的MySQ ...

  4. 下载kali以及安装

    一.kali下载 下载地址:https://www.kali.org/get-kali/#kali-virtual-machines 二.kali安装 1.打开VMware,打开文件,选择刚刚下载并解 ...

  5. week_4

    Andrew Ng 机器学习笔记---by Orangestar Week4_Neural Networks : Representation 1. Non-linear Hypotheses 当特征 ...

  6. 1、Java数据类型

    1.基本数据类型的变量: /** * 1.基本数据类型的变量: * * 1).整数类型:byte(1字节=8bit),short(2字节),int(4字节),long(8字节) * * 2).浮点数类 ...

  7. 【转载】C#使用Dotfuscator混淆代码以及加密

    C#编写的代码如果不进行一定程度的混淆和加密,那么是非常容易被反编译进行破解的,特别是对于一些商业用途的C#软件来说,因为盯着的人多,更是极易被攻破.使用Dotfuscator可以实现混淆代码.变量名 ...

  8. java后端整合极光消息推送

    目录 1.简介 2.极光Demo 2.1.进入极光官网--应用管理 2.2.快速集成一个Android/iOS的SDK​ 2.3.java服务端代码 3.参考资料 1.简介 简单来说,就是androi ...

  9. Spark详解(08) - Spark(3.0)内核解析和源码欣赏

    Spark详解(08) - Spark(3.0)内核解析和源码欣赏 源码全流程 Spark提交流程(YarnCluster) Spark通讯架构 Spark任务划分 Task任务调度 Shuffle原 ...

  10. 区块链特辑——solidity语言基础(七)

    Solidity语法基础学习 十.实战项目(二): 3.项目实操: ERC20 代币实战 ①转账篇 总发行量函数 totalSupply() return(uint256) ·回传代币的发行总量 ·使 ...