https://codeforces.com/contest/1207/problem/C
长度为n的二进制字符串
字符0位置长度可以为1/2
字符1位置长度只为2
红色管道拐弯长为2
红色单位长度花费a 黑色单位长度花费b
求最小花费
0-n
分最左端 中间1-n-1 最右端 考虑
#include <bits/stdc++.h>
using namespace std;
#define rep(i,a,n) for (int i=a;i<=n;i++)
#define pb push_back
#define mp make_pair
#define IO ios::sync_with_stdio(false)
#define fi first
#define se second
typedef long long ll;
typedef pair<int,int> pii;
const int maxn=2e5+5;
const int maxm=1e6+5;
const ll INF=0x3f3f3f3f3f3f3f3f;
const ll mod=1e9+7;
ll q,n,a,b;
ll dp[maxn][3];//位置范围0-n 高度1/2
vector<int> v;
string s;
int main(){
cin>>q;
while(q--){
cin>>n>>a>>b;
cin>>s;
memset(dp,0,sizeof dp);
//最左端
dp[0][1]=b; //位置0 高度只为1 花费黑b
dp[0][2]=INF;
for(int i=1;i<=n-1;i++) //0-n 中间 1-n-1
{
if(s[i-1]=='0' && s[i]=='0'){ //1 0 0
dp[i][1]=min(dp[i-1][1]+a+b,dp[i-1][2]+2*a+b);
}
else{
dp[i][1]=INF;
}
//中间一般 2->2 s[i]='0' 或s[i-1]='0' 0 1(可能i=1 s[0]=0 s[1]=1 高度1->2) 1 0 1 1 0 0(2->2)
dp[i][2]=min(dp[i-1][2]+a+2*b,dp[i-1][1]+2*a+2*b);
}
dp[n][1]=min(dp[n-1][2]+2*a+b,dp[n-1][1]+a+b); //(10)2->1 (00)1->1
cout<<dp[n][1]<<endl;
}
return 0;
}