字符序列

问题描述:
从三个元素的集合[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\n", ans);
29     return 0;
30 }

 

posted @ 2018-03-30 19:21  mrclr  阅读(2582)  评论(0编辑  收藏  举报