Luhhy老师最近在研究字符串,只含有字符“a”和“b”的字符串。
她想定义一类串为孤独的串,这类串的特点是串中存在某个字符“a”,它只与“b”相邻或者无相邻字符(比如长度为1的字符串“a”)。
如“babaa”是孤独的串,因为第一个“a”左右两边都是“b”。“aaba”也是,因为最后一个“a”的存在使该串符合条件。
特殊的,一个只含有字符“b“的串不是孤独的串。
现在,给一个正整数n,Luhhy想知道长度为n的孤独的串的数量有多少个。
输入要求
输入数据第一行是一个正整数 T (1<=T<=100),表示数据组数。
接下来 T 行每行一个正整数 n (1<=n<=100),表示字符串长度。
输出要求
对于每组输入,输出一行,表示孤独的串的数量。
样例输入
3
1
2
4
样例输出
1
2
9
思路:看了官方题解,反着dp,令
f
i
f_i
fi表示长度为
i
i
i的非孤独的字符串数,那么从
f
i
−
1
f_{i-1}
fi−1再加上
a
a
a或
b
b
b,两种选择;加上
a
a
a时,可能会以
b
a
ba
ba结尾,舍去;同时,加上
a
a
a时,
b
a
ba
ba结尾的变为
b
a
a
baa
baa结尾,此时也为非孤独。转移方程
f
i
=
2
∗
f
i
−
1
−
f
i
−
2
+
f
i
−
3
f_i=2*f_{i-1}-f_{i-2}+f_{i-3}
fi=2∗fi−1−fi−2+fi−3
代码
#include<bits/stdc++.h>
using namespace std;
#define ll __int128
ll dp[102];
ll a[102];
/*
f[n] = 2*f[n-1] - f[n-2] + f[n-3]
f[n] = f[n-1] + f[n-2] + f[n-4]
*/
void print(ll x) {
if(x/10) print(x/10);
putchar('0'+x%10);
}
int main() {
dp[1] = 1;
dp[2] = 2;
dp[3] = 4;
dp[4] = 7;
for(int i = 5;i <= 100;++i)
dp[i] = 2*dp[i-1] - dp[i-2] + dp[i-3];
a[0] = 1;
for(int i = 1;i <= 100;++i)
a[i] = a[i-1]*2;
int t;scanf("%d",&t);
while(t--) {
int n;
scanf("%d",&n);
print(a[n]-dp[n]);
puts("");
}
}