• 字符序列


    问题描述:
    从三个元素的集合[A,B,C]中选取元素生成一个N 个字符组成的序列,使得没有两个相邻的子序列(子序列长度=2)相同,例:N=5 时ABCBA 是合格的,而序列ABCBC 与ABABC 是不合格的,因为其中子序列BC,AB 是相同的。
    输入N(1<=N<=12),求出满足条件的N 个字符的所有序列和其总数。


    输入样例:
    4


    输出样例:
    72

    这道题刚开始我想的是dp,而且写出来后当 n == 4 的时候也确实是72,结果交上去就GG了。每一个测试点数都大了一些。调试了半天还是没调出来。

    所以这里就先讲一下正解吧。因为数据范围才是1到12,所以比较暴力的算法就能过,暴力的算法就是搜索了,作为一个oier,应该有这种数据的敏感性。

    对于每一位的字符,搜索的范围就是A到C,然后只要判断  i == a[x - 2] && a[x - 1] == a[x - 3] 的时候舍去就行了,其他情况正常递归。

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<algorithm>
     4 #include<cmath>
     5 #include<iostream>
     6 #include<string>
     7 using namespace std;
     8 typedef long long ll;
     9 const int maxn = 1e4 + 5;
    10 int n, ans, a[maxn];
    11 void dfs(int x)
    12 {
    13     if(x == n + 1) {ans++; return;}
    14     for(int i = 1; i <= 3; ++i)
    15     {
    16         if(i == a[x - 2] && a[x - 1] == a[x - 3]) continue;
    17         a[x] = i;
    18         dfs(x+1);
    19     }
    20 }
    21 
    22 int main()
    23 {
    24     freopen("characts.in","r",stdin);
    25     freopen("characts.out","w",stdout);
    26     scanf("%d", &n);    
    27     dfs(1);
    28     printf("%d
    ", ans);
    29     return 0;
    30 }
  • 相关阅读:
    99. 恢复二叉搜索树
    337. 打家劫舍 III(dp+dfs)
    45. 跳跃游戏 II
    贪心
    460. LFU 缓存
    213. 打家劫舍 II(dp)
    MyScript 开发文档
    Android 全面屏体验
    Android Studio 导入自己编译的 framework jar
    cmake常用配置项
  • 原文地址:https://www.cnblogs.com/mrclr/p/8678120.html
Copyright © 2020-2023  润新知