CF399B Red and Blue Balls 題解
阿新 • • 發佈:2022-02-15
分析
本題暴力解法會 TLE,所以我們需要進一步分析。
定義狀態 \(a_i\) 表示把前 \(i\) 個球全部變為紅色的步數,那麼如果第 \(i\) 個球是藍色的話,我們需要做如下操作:
-
把前 \(i-1\) 個球彈出;
-
把第 \(i\) 個球變成紅色;
-
把第 \(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} \]最後,統計:
就是最終的答案。其中 \(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"); }