题面传送门
这道题…真的无语了。
一眼看上去这道题似乎可以状压
d
p
dp
dp,只有
L
L
L和
R
R
R两种,然后我手算把样例转成了二进制,准备推转移方程,结果惊奇的发现
R
B
R
=
(
101
)
2
=
2
RBR=(101)_2=2
RBR=(101)2=2,这不就是样例的答案吗?接着推了第二个样例的答案,居然也对了。
言归正传,那么我们设
f
i
f_i
fi为把
i
i
i以及其上面的全部翻转为红色的步骤数,那么显然,如果
a
i
=
B
a_i=B
ai=B,那么在翻
a
i
a_i
ai之前一定他前面的都是
R
R
R,那么之后的第一步一定是将所有的
a
i
a_i
ai上面的拿走,把
a
i
a_i
ai变色,把
a
i
a_i
ai上面全部填充成
B
B
B,根据定义,很容易得到递推式
f
i
=
(
∑
j
=
1
i
−
1
f
j
)
+
1
f_i=(\sum\limits_{j=1}^{i-1}f_j)+1
fi=(j=1∑i−1fj)+1,再根据
f
i
−
1
f_{i-1}
fi−1的定义,很容易得到递推式优化
f
i
=
2
×
f
i
−
1
f_i=2\times f_{i-1}
fi=2×fi−1,边界条件为
f
1
=
1
f_1=1
f1=1这很显然,所以我们直接可以用
<
<
<<
<<运算符解决这个问题。
代码实现:
#include<cstdio>
using namespace std;
long long ans,tot,pus,n;
char s;
int main(){
register int i;
scanf("%lld",&n);
for(i=1;i<=n;i++){
s=getchar();
while(s<'A'||s>'Z') s=getchar();
if(s=='B') ans+=1ll<<(i-1);
}
printf("%lld\n",ans);
}