这篇博文是本蒟蒻第一次写CSDN博客。
旨在熟悉一下CSDN博客的使用方式。
写的不好,各位客官见笑了
本篇写的题是今年4月份(具体时间记不清了)的一次模拟赛的L3-3
现在是PTA的CCCC练习集中的L3-020题
题干为:给定一个全部由小写英文字母组成的字符串,允许你至多删掉其中 3 个字符,结果可能有多少种不同的字符串?

其实看到这道题,第一反应就是,DP,而且一下子就能看出四大类状态 删0个,删1个,删2个,删3个
但是想不明白过程,于是去想数学方法,显然数学方法不好整啊。。
好的,废话不多说,让我们开始讲一讲这道题吧。
这道DP其实并不难,想不通只能说明还没学懂DP。

一、明确状态与状态值
显然,状态值就是答案值,就是一个 长为 i 的串 操作后的串的种数 ,即dp[i]
由于状态细分 开启第二维 即 dp[i][0] dp[i][1] dp[i][2] dp[i][3] 之和为长度 为 i 的串的答案值
然后我们再明确一下 1 2 3 表示什么 既然目前手里的串 是长度为 i 那你就不可能去删 i+1 i+2
所以 0:不删 1:前 i 个字符都被删过一次的状态 2:前 i 个字符 任意两两都被删过一次的状态 3:同理
然后 不要过多纠结这个值难以直接求 之类的事情
你要知道 就把这样一个完成状态当作已知量 然后判断过程 状态转移搞出来答案就都出来了

二、状态转移
此时 等价于 求 已知 长度为 i 的串的状态及答案 然后我们求 i+1 的串的答案
看下面一个例子 比方说我们要求一个 长度 4 的串 icpc , 它是从 长度 3 的 icp 转来的
icp 的 状态1 是什么呢 删过 i 删过 c 删过 p ,且答案值为 3 (cp,ip,ic) 那么转移到 icpc 的状态1呢
不删 c 或删 c 不删则继承答案值 dp[3][1]=3 ,删发现答案值 +1 所以答案为 dp[4][1]=4
icp 的 状态2 是什么呢 删过 ic ip cp ,且答案值为 3(p,c,i) 那么转移到 icpc 的状态2 呢
icp c 不删这个 c 则从前面删两个继承答案值 dp[3][2]=3,删掉它的话 还得再从前面删一个
删掉 这个 c 之后 再从前三个删掉一个 就是前三个删掉一个的值 也就是 dp[3][1]=3 的值
好的 于是你写下了 dp[4][2]=dp[3][2]+dp[3][1]=6 可惜这是错的 正确答案是 5 显然有重的
为什么会有重复的呢 让我们好好分析下吧。
dp[3][2] 对应剩 i c p 后面添一个 c 变成 ic cc pc
dp[3][1] 对应剩 ic ip cp 后面的 c 由于也被删掉 剩的就是 ic ip cp
你发现 ic 重复了 很明显是由于 我们当前判断的 这个 c 发生的重复导致的影响
我们应该减去这些东西 但是怎么减呢
以上面那个为例 它为什么会重复呢 因为是 删掉两个 你删 cp 和 pc 由于 c 的重复 导致结果相同
由于是两个 不难发现其实 就是因为这两个 c 隔着 的距离 是 4-2=2
事实上 你写几组例子 也会发现 影响半径实际上就是 j
那么 我们只需要 判断 i-j<=k<=i-1 范围内 的 s[k]==s[i] 的情况产生的影响即可
这时 从 k 到 i-1 之间(包括边界) 的点都删掉才会出现重复
那么 前 k-1 个还需要删掉 j-(i-k) 个 所以去掉的种数 就是 dp[k-1][j-(i-k)]
至于多次 重复 只需要找到最后一个k 即可 因为一个 dp 就把前面的都包括了 我相信读者能理解了 就不细讲了
状态转移方程 就直接看代码吧 很清晰的 举例时只谈了 状态2 实际上状态3 也是完全一样很好理解就不讲了

顺便对样例(ababcc)打个表方便读者分析理解,横行为 i ,纵行为 j ,值为dp 值
1 2 3 4 5 6
0 1 1 1 1 1 1
1 1 2 3 4 5 5
2 0 1 2 4 8 9
3 0 0 1 2 6 10

AC代码如下:

#pragma GCC optimize(2)
#include <bits/stdc++.h>
using namespace std;
using ll=long long;
char s[1000005];
ll dp[1000005][4]={1};
int i,j,k,n;
int main()
{ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);cin>>(s+1);n=strlen(s+1);for(int i=1;i<=n;i++) for(j=0;j<=3;j++){dp[i][j]+=dp[i-1][j];if(j) dp[i][j]+=dp[i-1][j-1];for(k=i-1;k>=max(1,i-j);k--) if(s[i]==s[k]){dp[i][j]-=dp[k-1][j-(i-k)];break;}}cout<<1+dp[n][1]+dp[n][2]+dp[n][3]<<endl;return 0;
}

CCCC/PTA 2019模拟赛 L3-3 至多删三个字符相关推荐

  1. 团体程序设计天梯赛-练习集——L3-020 至多删三个字符

    给定一个全部由小写英文字母组成的字符串,允许你至多删掉其中 3 个字符,结果可能有多少种不同的字符串? 输入格式: 输入在一行中给出全部由小写英文字母组成的.长度在区间 [4, 106] 内的字符串. ...

  2. 【CCCC】L3-020 至多删三个字符 (30分),序列dp+去重

    problem L3-020 至多删三个字符 (30分) 给定一个全部由小写英文字母组成的字符串,允许你至多删掉其中 3 个字符,结果可能有多少种不同的字符串? 输入格式: 输入在一行中给出全部由小写 ...

  3. L3-2 至多删三个字符

    L3-2 至多删三个字符 题意: 给定一个全部由小写英文字母组成的字符串,允许你至多删掉其中 3 个字符,结果可能有多少种不同的字符串? 题解: 最不擅长dp 我们设dp[i][j]表示前i里面删除j ...

  4. 至多删三个字符(动态规划字符串问题)

    7-14 至多删三个字符 (35 分) 给定一个全部由小写英文字母组成的字符串,允许你至多删掉其中 3 个字符,结果可能有多少种不同的字符串? 输入格式: 输入在一行中给出全部由小写英文字母组成的.长 ...

  5. 程序设计天梯赛L3-20 至多删三个字符(dp,一生之敌)

    题目 题意: 给定一个全部由小写英文字母组成的字符串,允许你至多删掉其中 3 个字符,结果可能有多少种不同的字符串?(|S|<=1e6) 思路: 可以暴力水分,pta数据比较水,用set把所有删 ...

  6. L3-020 至多删三个字符 (30 分)-PAT 团体程序设计天梯赛 GPLT

    给定一个全部由小写英文字母组成的字符串,允许你至多删掉其中 3 个字符,结果可能有多少种不同的字符串? 输入格式: 输入在一行中给出全部由小写英文字母组成的.长度在区间 [4, 106] 内的字符串. ...

  7. L3-020 至多删三个字符 (30 分) DP

    给定一个全部由小写英文字母组成的字符串,允许你至多删掉其中 3 个字符,结果可能有多少种不同的字符串? 输入格式: 输入在一行中给出全部由小写英文字母组成的.长度在区间 [4, 106] 内的字符串. ...

  8. 至多删三个字符 (35分)

    给定一个全部由小写英文字母组成的字符串,允许你至多删掉其中 3 个字符,结果可能有多少种不同的字符串? 输入格式: 输入在一行中给出全部由小写英文字母组成的.长度在区间 [4, 10​6​​] 内的字 ...

  9. L3-020 至多删三个字符 (30 分)

    题目: 给定一个全部由小写英文字母组成的字符串,允许你至多删掉其中 3 个字符,结果可能有多少种不同的字符串? 输入格式: 输入在一行中给出全部由小写英文字母组成的.长度在区间 [4,106][4,1 ...

最新文章

  1. gradle仓库配置
  2. swift_031(Swift 中的枚举/原始值(RawValues))
  3. 如果有人把支付宝的服务器炸了,你的两毛五是不是就没了?
  4. MyDAL - .IsExistAsync() 使用
  5. 在 Ubuntu 16.04 LTS 上安装 Python 3.6.0
  6. java 枚举使用例子_Java枚举详解及使用实例(涵盖了所有典型用法)
  7. postmessage 游戏窗口内无效_前端的微前端在交通项目内的应用实践
  8. outlook自动保存html,当创建一个新的HTML电子邮件时保持默认的Outlook格式
  9. node-webkit学习(1)hello world
  10. 试编写一个将双向循环链表逆置的算法_图解:链表的快慢指针,解决 80% 的链表面试题!...
  11. java中的getnumber怎么用_java安全编码指南之:Number操作详解
  12. 快速学习nodejs系列:四、nodejs特性1--单线程
  13. 用C#在Visual Studio写Javascript单元测试
  14. 不知道如何识别图片文字?这个方法用了都说好
  15. upc 卡德加的兔子 线段树 + 矩阵快速幂
  16. Leetcode——860.柠檬水找零——题解—+代码实现
  17. 黑鲨3能用鸿蒙系统吗,黑鲨游戏手机3支持语音操控:没有三头六臂照样吃鸡
  18. 态度和态度改变:影响思维和情绪
  19. 【Java-语言入门】开发 迷你图书管理器
  20. Home Assistant + 树莓派:强大的智能家居系统

热门文章

  1. laradock 进入 工作区
  2. SCUT - 48 - 飞行员的配对方案 - 费用流
  3. c#进阶之lambda表达式
  4. 行高引起的行内块级元素间距
  5. 如何修改博客园里个人首页背景(form:cot 大犇)
  6. 12.Bridge-桥接模式
  7. MVC自学系列之四(MVC模型-Models)
  8. asp.net mvc 注册中的邮箱激活功能实现(二)
  9. Effective C++ 读书笔记之Part4.Design and Declarations
  10. 学习 MFC 的好网站