网易2017秋--暗黑的字符串

题目描述:一个只包含'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

扫描二维码关注公众号,回复: 2872167 查看本文章

输出:

9

21

分析:定义dp1[i]为结尾两个字符相同,长度为i的暗黑字符串个数(AA,BB,CC,AAA,BAA,CAA等)

         定义dp2[i]为结尾两个字符不同,长度为i的暗黑字符串个数(AB,AC,AAB,AAC等)

         所求即为dp1[n]+dp2[n].

        dp1[i]=dp1[i-1]+dp2[i-1]     dp2[i]=dp1[i-1]*2+dp2[i-1]   时间复杂度为o(n).

代码:

        #include<bits/stdc++.h>
        using namespace std;
        int main()

        {

            int n;
            cin>>n;
            long long dp1[35];
            long long dp2[35];
            dp1[1]=0,dp1[2]=3;
            dp2[1]=3,dp2[2]=6;
            for(int i=3;i<=n;i++)
            {
                dp1[i]=dp1[i-1]+dp2[i-1];
                dp2[i]=2*dp1[i-1]+dp2[i-1];
            }
             cout<<dp1[n]+dp2[n]<<endl;
             return 0;
        }


猜你喜欢

转载自blog.csdn.net/sinat_37903653/article/details/79707604