给你一个01串,要求每次删除连续的0或者1,求把所有字符全部删除的最少操作次数
设串(str = s_1s_2s_3...s_n)由n个块组成,其中(s_i)为0串或1串,满足(s_i)和(s_{i - 1}), (s_{i + 1})不同,那么能够获得最少操作次数的删除方式为每次删除第二个块,这样每次删除后块数减少2
n为偶数时,次数为(n - 2) / 2 + 2, n为奇数时,次数为(n - 1) / 2 + 1,都等价于(lfloor n/2 floor + 1)
#include<iostream>
#include<string>
using namespace std;
const int N = 110;
int t, n, a, b;
string s;
int q[N];
void solve(){
cin >> n >> a >> b >> s;
int cnt = 1;
for(int i = 1; i < s.size(); i ++)
if(s[i] != s[i - 1]) cnt ++;
cout << a * n + max(n * b, (cnt / 2 + 1) * b) << endl;
}
int main(){
cin >> t;
while(t --) solve();
}