• 动态规划: 套路之推导公式 黑暗字符串 牛客


    [编程题] 暗黑的字符串

    一个只包含'A'、'B'和'C'的字符串,如果存在某一段长度为3的连续子串中恰好'A'、'B'和'C'各有一个,那么这个字符串就是纯净的,否则这个字符串就是暗黑的。例如:
    BAACAACCBAAA 连续子串"CBA"中包含了'A','B','C'各一个,所以是纯净的字符串
    AABBCCAABB 不存在一个长度为3的连续子串包含'A','B','C',所以是暗黑的字符串
    你的任务就是计算出长度为n的字符串(只包含'A'、'B'和'C'),有多少个是暗黑的字符串。

    输入描述:
    输入一个整数n,表示字符串长度(1 ≤ n ≤ 30)
    输出描述:
    输出一个整数表示有多少个暗黑字符串
    输入例子:
    2
    3
    输出例子:
    9
    21

    解题思路:

      以为找规律,其实也是一种动态规划.而且还是一种典型的数论动态规划.

      假设: 长度为n的字符串. 通过前面n-1长度的字符串来推到.

    假设:
        f(n - 1) = S(n - 1) + D(n - 1);
    f:表示n-1长的黑暗字符串数 , S:表示n-1长的黑串结果中后两位相同的数目 D:后两位不同的数目;
    为啥这么设,从n-1开始设方程,是为了通过f(n-1)来表示f(n)

    观察变化过程:
    1.S: eg:"AA" -> 增加1位结果:AAA AAB AAC 2.D: eg:"AB" -> 增加1位结果:ABA ABB target. f(n) = 3*S(n - 1) + 2*D(n - 1) = 2*f(n - 1) + S(n - 1); 发现S(n - 1)并不知道, 我们就在往前看一步,试着找出 f(n - 2)与 S(n - 1)之间的关系.好吧,其实一开始并不知道与谁的关系 总之要找S与别的变量的关系.

    推导: 依据假设,有:f(n
    - 1) = S(n - 1) + D(n - 1); 3.每个S(n - 1)都能够得到3个结果,根据1.知 其中的一个 是 S状态的(S(n))AAA 4.每个D(n - 1)都能够得到2个结果,根据2.知 其中的一个 是 S状态的(S(n))ABB 根据 3. 4. 得到: 5. S(n) = S(n - 1) + D(n - 1); 根据假设5. 可以得到 f(n - 1) = S(n) 推到得到: S(n - 1) = f( n - 2 ); 带入 target.得到 f(n) = 2*f(n - 1) + f(n - 2);
     
  • 相关阅读:
    python学习--大数据与科学计算第三方库简介
    养生轴---茶轴
    MobaXterm的安装和使用
    如何解决RIP的问题
    评论博客时注意的地方
    回忆老师教学博客
    助教自我介绍
    《构建之法》读书笔记1
    插入排序
    总结之H3C汇聚层交换机认证在线人数展示系统
  • 原文地址:https://www.cnblogs.com/luntai/p/6236385.html
Copyright © 2020-2023  润新知