码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 【Algorithm】GPLT L3-020 至多删三个字符


    L3-020 至多删三个字符

     

    dp[i][j]  表示前 i 个字符删掉 j 个字符结果有 dp[i][j] 个。

    dp[i][j] = dp[i - 1][j] + dp[i - 1][j - 1]

    1. 第 i 个字符不删,前 i - 1 个字符删除掉 j 个再加上当前字符能取到的个数。
    2. 第 i 个字符删了,前 i - 1 个字符删除掉 j - 1 个能取到的个数。

    这样会有重复的。例如一个字符串 abcdefdxyz,删除 def 和删除 efd 后得到的字符串都是abcdxyz,这时候就要去重了。

    根据上面那个例子,可以发现对于一个字符 s[ i ],如果在 i 之前存在一个 last,使得 s[ last ] = s[ i ],那么删除 [ last, i - 1 ] 间的字符和删除 [ last + 1, i ] 间的字符其实是重复的。

    那么 dp[ i ][ j ] 就要减去这个重复,这个重复可表示为 dp[ last - 1 ][ j - ( i - last ) ]。当然,如果 i 与last 的差大于等于目前的 j,就已经不可能受到影响了。

    abcdefdxyz

    abcdefdxyz

    删去左部分和右部分的情况重复,那么就需要去重。

    首先,如果我们已经决定要删去左部分,删除个数为 i - last 个,还需在前 last - 1 个字符种删除 j - (i - last) 个,即 dp[ last - 1 ][ j - ( i - last ) ]。

    选择上述去重,而不是选择右部分 dp[ last ][ j - ( i - last ) ],是因为左部分是已经去重过了,而右部分还存在重复的影响。

    1. #include <iostream>
    2. #include <cstring>
    3. using namespace std;
    4. typedef long long LL;
    5. const int N = 1e6 + 10;
    6. char s[N];
    7. LL dp[N][4];
    8. int vis[30];
    9. int main()
    10. {
    11. scanf("%s", s + 1);
    12. int len = strlen(s + 1), last;
    13. for (int i = 0; i <= len; i++) dp[i][0] = 1;
    14. for (int i = 1; i <= len; i++) {
    15. last = vis[s[i] - 'a'];
    16. vis[s[i] - 'a'] = i;
    17. for (int j = 1; j <= 3; j++) {
    18. dp[i][j] = dp[i - 1][j] + dp[i - 1][j - 1];
    19. if (last && j - (i - last) >= 0)
    20. dp[i][j] -= dp[last][j - (i - last)];
    21. }
    22. }
    23. printf("%lld\n", dp[len][0] + dp[len][1] + dp[len][2] + dp[len][3]);
    24. return 0;
    25. }

  • 相关阅读:
    【付费推广】常见问题合集,推荐榜单FAQ
    动态规划解决leetcode上的两道回文问题(针对思路)
    AHR亚马逊账户健康评级多久更新,如何查看解决
    进程、CPU、MMU与PCB之间的关系
    2024版彩虹晴天全能知识付费源码+虚拟商城解决方案 含一键搭建视频教程 无授权限制
    Chrome插件精选 — 广告拦截插件
    怎么监控上网记录?监控上网记录的软件推荐
    C语言——结构体(入门)
    Nginx之动静分离解读
    【僵尸进程和文件系统调用】
  • 原文地址:https://blog.csdn.net/y__a__o/article/details/125426846
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号