2020“远光杯”网络资格赛R 孤独的字符串(dp/容斥)

题目

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} fi1再加上 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=2fi1fi2+fi3
代码

#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("");
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值