问题描述:
从三个元素的集合[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 }