CF399B Red and Blue Balls 题解

题目传送门

分析

本题暴力解法会 TLE,所以我们需要进一步分析。

定义状态 \(a_i\) 表示把前 \(i\) 个球全部变为红色的步数,那么如果第 \(i\) 个球是蓝色的话,我们需要做如下操作:

  1. 把前 \(i-1\) 个球弹出;

  2. 把第 \(i\) 个球变成红色;

  3. 把第 \(i\) 个球前面填上蓝色球。

显然,既然取到了第 \(i\) 个球,那这个球前面的一定都是红球,需要 \(a_{i-1}\) 次转换,那么转移方程如下:

\[a_i=\begin{cases}1,&i=1,\\\sum\limits_{j=1}^{i-1}a_{j}+1,&i\ge2.\end{cases} \]

最后,统计:

\[\sum_{i=1,s_i=\texttt{B}}^{n}a_i \]

就是最终的答案。其中 \(s_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");
}
posted @ 2022-02-15 19:10  tmjyh09  阅读(57)  评论(0)    收藏  举报