分析
本题暴力解法会 TLE,所以我们需要进一步分析。
定义状态 a i a_i ai 表示把前 i i i 个球全部变为红色的步数,那么如果第 i i i 个球是蓝色的话,我们需要做如下操作:
-
把前 i − 1 i-1 i−1 个球弹出;
-
把第 i i i 个球变成红色;
-
把第 i i i 个球前面填上蓝色球。
显然,既然取到了第 i i i 个球,那这个球前面的一定都是红球,需要 a i − 1 a_{i-1} ai−1 次转换,那么转移方程如下:
a i = { 1 , i = 1 , ∑ j = 1 i − 1 a j + 1 , i ≥ 2. a_i=\begin{cases}1,&i=1,\\\sum\limits_{j=1}^{i-1}a_{j}+1,&i\ge2.\end{cases} ai=⎩⎪⎨⎪⎧1,j=1∑i−1aj+1,i=1,i≥2.
最后,统计:
∑ i = 1 , s i = B n a i \sum_{i=1,s_i=\texttt{B}}^{n}a_i i=1,si=B∑nai
就是最终的答案。其中 s i s_i si 表示第 i i i 个球的颜色。
代码实现
#include <bits/stdc++.h>
using namespace std;
long long a[55];
int n;
char s[55];
int main(){
cin>>n>>s+1;
a[1]=1;
for(int i=2;i<=n;i++){
for(int j=1;j<i;j++)a[i]+=a[j];
a[i]++;
}
long long ans=0;
for(int i=1;i<=n;i++)if(s[i]=='B')ans+=a[i];
cout<<ans;
//system("pause");
}