zoukankan      html  css  js  c++  java
  • 动态规划: 套路之推导公式 黑暗字符串 牛客

    [编程题] 暗黑的字符串

    一个只包含'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);
     
  • 相关阅读:
    阅读ajax.pdf
    XPath 学习
    随想
    Angular JS 学习
    Angular JS 学习
    URL Rewrite in IIS with Regular Pattern
    LinQ In Action 学习第四章
    GC垃圾回收
    jvm底层
    类加载流程
  • 原文地址:https://www.cnblogs.com/luntai/p/6236385.html
Copyright © 2011-2022 走看看