zoukankan      html  css  js  c++  java
  • 字符序列(题解)

    字符序列(characts)


    问题描述:

    从三个元素的集合[A,B,C]中选取元素生成一个N 个字符组成的序列,使得没有两个相邻的子序列(子序列长度=2)相同,例:N=5 时ABCBA 是合格的,而序列ABCBC 与ABABC 是不合格的,因为其中子序列BC,AB 是相同的。

    输入N(1<=N<=12),求出满足条件的N 个字符的所有序列和其总数。

    输入样例1:

    4

    输出样例1:

    72

    输入样例2:

    2

    输出样例2:

    9

    这道题可以用模拟的思想:给定一个字符串,对于当前这位和前面的第二位;这一位的前面的第一位和这一位前面的第三位,来进行比较。如果他们相等的话,就表明肯定是不符合的;如果他们不相等的话,就可以进行下一位的判断。

    当然,这些是基于字符的操作。所以,还有一种更简便的算法:把A、B、C看作数字1、2、3,每次进行+1操作。如果+1后的数超过3,就可以从1开始继续加,最后用DFS串一下就可以解决了。

    代码:

    #include<cstdio>
    #include<cmath>
    #define end return
    int n,sum=0;
    int ans[15];
    bool pd()
    {
        int cnt=0;
        for(int i=3; i<=n; i++)
        {
            if(ans[i]==ans[i-2])
                cnt++;
            else
            {
                cnt=0;
            }
            if(cnt==2)
                end 0;
        }
        end 1;
    }
    void dfs(int x)
    {
        if(x == n + 1)
        {
            if(pd())
                sum++;
            end;
        }
        for(int i=1; i<=3; i++)
        {
            ans[x]=i;
            dfs(x+1);
        }
    }
    int main()
    {
        //freopen("characts.in","r",stdin),freopen("characts.out","w",stdout);
        scanf("%d",&n);
        dfs(1);
        printf("%d",sum);
        end 0;
    }
  • 相关阅读:
    centos 系统时间设置
    centos6 centos7 配置开机启动服务
    centos6.9 samba配置
    vmware异常关闭后导致虚拟机无法打开问题解决办法
    try using -rpath or -rpath-link
    ZR#988
    提高十连测day3
    Atcoder ABC 141
    ZR#957
    ST表
  • 原文地址:https://www.cnblogs.com/Zhoier-Zxy/p/8672203.html
Copyright © 2011-2022 走看看