CF399B Red and Blue Balls
题面传送门
这道题......真的无语了。
一眼看上去这道题似乎可以状压\(dp\),只有\(L\)和\(R\)两种,然后我手算把样例转成了二进制,准备推转移方程,结果惊奇的发现\(RBR=(101)_2=2\),这不就是样例的答案吗?接着推了第二个样例的答案,居然也对了。
言归正传,那么我们设\(f_i\)为把\(i\)以及其上面的全部翻转为红色的步骤数,那么显然,如果\(a_i=B\),那么在翻\(a_i\)之前一定他前面的都是\(R\),那么之后的第一步一定是将所有的\(a_i\)上面的拿走,把\(a_i\)变色,把\(a_i\)上面全部填充成\(B\),根据定义,很容易得到递推式\(f_i=(\sum\limits_{j=1}^{i-1}f_j)+1\),再根据\(f_{i-1}\)的定义,很容易得到递推式优化\(f_i=2\times f_{i-1}\),边界条件为\(f_1=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);
}