当前位置: 首页 > news >正文

小红的漂亮串(C++ DP 取模运算)

题目描述

小红定义“漂亮串”为:至少有两个“red”子串。
n 个字符的字符串(只有小写字母),一共有多少种漂亮串,结果对 1 e 9 + 7 1e9+7 1e9+7 取模。

分析

至少”两个,那就总的,把 0 个”red”, 和 1 个“red”减去就是我们想要的结果,

也可以直接用排列组合,数学公式算结果,但是会溢出,因为有阶乘,高次幂和除法取模,答案总是差一些,就是要给你设限制。

维护两个DP数组:
A[i]表示长度 i i i 的字符串中一个red也没有的种类数;
B[i]表示长度 i i i 的字符串中有且只有一个red的种类数;

对于A[i]:

  • 不选字符d,即没有构成一个新red的可能,除了d还有25个字母, 那么A[i] = A[i-1]*25。
  • 选字符串d,即构成red的可能,它的前两个字符就不能是re,否则符合“一个red也没有”。所以此时A[i] = A[i-1] -A[i-3]。
  • 综上, A [ i ] = A [ i − 1 ] ∗ 26 − A [ i − 3 ] A[i] = A[i-1]*26-A[i-3] A[i]=A[i1]26A[i3]

对于B[i]:

  • 不选字符d,B[i] = B[i-1]*25
  • 选字符d
    • 若之前一个red也没有,且前两个字符为re,那就正好有一个red,B[i] = A[i-3]
    • 若之前已经有一个red,那他的前两个字符不能是re。B[i] = B[i-1] - B[i-3]
  • 综上, B [ i ] = B [ i − 1 ] ∗ 26 − B [ i − 3 ] + A [ i − 3 ] B[i]=B[i-1]*26-B[i-3]+A[i-3] B[i]=B[i1]26B[i3]+A[i3]

递推公式:

a n s ( n ) = 2 6 n − A [ n ] − B [ n ] ans(n)=26^n-A[n]-B[n] ans(n)=26nA[n]B[n]

然后就是按照DP问题的解法,以上部分完成了:

  1. DP数组的含义
  2. 递推公式

至于遍历顺序和初始化,比较简单,请直接看代码。

#include <iostream>
#include <vector>

#define MOD 1000000007
typedef long long ll;

using namespace std;

ll beautifulString(int n){
    ll ans = 26 * 26;

    vector<ll> A(n + 1), B(n + 1); // DP数组的含义 和 初始化很重要, 请注意
    A[0] = 1; A[1] = 26; A[2] = 26 * 26;
    B[0] = 0; B[1] = 0; B[2] = 0;

    for(int i = 3; i <= n; i++) { // 遍历顺序
        // 递推公式
        A[i] = (A[i - 1] * 26 % MOD - A[i - 3] % MOD) % MOD;
        B[i] = (B[i - 1] * 26 % MOD + (A[i - 3] - B[i - 3]) % MOD) % MOD;
        ans = (ans * 26) % MOD;
    }

    ans = (ans - (A[n] + B[n]) % MOD) % MOD;

    return ans;
}

int main(){
    int n;
    cin >> n; 
    cout << beautifulString(n);
    return 0;
}

主要是熟悉对于”至少”问题的敏感性,DP问题的解决,还有取模运算的规律。

相关文章:

  • MYSQL高可用集群MHA架构
  • Python进阶(三)-图形界面编程Tkinter(3)
  • Rethinking Image Aesthetics Assessment:Models,Datasets and Benchmarks
  • 人工智能时代的离散数学教学研究
  • frp内网穿透教程2022最新(含内网ssh配置与msf联动配置)
  • TS装饰器
  • PAT 1007 Maximum Subsequence Sum
  • go中的slice
  • 什么是完全的静态分析?
  • 如何在ios手机上使用动态代理?
  • 搭建zookeeper集群
  • React生命周期详解
  • 大数据项目中数据倾斜
  • Kafka Consumer源码讲解
  • svg中 path标签的d属性
  • @jsonView过滤属性
  • [nginx文档翻译系列] 控制nginx
  • 2017年终总结、随想
  • Android 控件背景颜色处理
  • ComponentOne 2017 V2版本正式发布
  • eclipse的离线汉化
  • interface和setter,getter
  • JSONP原理
  • Netty+SpringBoot+FastDFS+Html5实现聊天App(六)
  • PHP 7 修改了什么呢 -- 2
  • SOFAMosn配置模型
  • SpiderData 2019年2月16日 DApp数据排行榜
  • Vue 2.3、2.4 知识点小结
  • Webpack 4 学习01(基础配置)
  • 大快搜索数据爬虫技术实例安装教学篇
  • 深度学习中的信息论知识详解
  • 异常机制详解
  • 自动记录MySQL慢查询快照脚本
  • ​你们这样子,耽误我的工作进度怎么办?
  • #!/usr/bin/python与#!/usr/bin/env python的区别
  • #pragma预处理命令
  • (2)nginx 安装、启停
  • (4)事件处理——(6)给.ready()回调函数传递一个参数(Passing an argument to the .ready() callback)...
  • (ctrl.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MDd_DynamicDebug”不匹配值“
  • (function(){})()的分步解析
  • (LeetCode C++)盛最多水的容器
  • (八)Spring源码解析:Spring MVC
  • (超详细)2-YOLOV5改进-添加SimAM注意力机制
  • (附源码)springboot建达集团公司平台 毕业设计 141538
  • (附源码)计算机毕业设计SSM智慧停车系统
  • (求助)用傲游上csdn博客时标签栏和网址栏一直显示袁萌 的头像
  • (五)MySQL的备份及恢复
  • (原創) X61用戶,小心你的上蓋!! (NB) (ThinkPad) (X61)
  • (正则)提取页面里的img标签
  • (转)甲方乙方——赵民谈找工作
  • **PyTorch月学习计划 - 第一周;第6-7天: 自动梯度(Autograd)**
  • .cfg\.dat\.mak(持续补充)
  • .gitattributes 文件
  • .Net 6.0 处理跨域的方式
  • .NET Conf 2023 回顾 – 庆祝社区、创新和 .NET 8 的发布