我的做法是dp,应该不用解释了吧。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int const maxn=2e5+5;
ll dp[maxn][2][2];
int c[maxn];
char s[maxn];
int main(){
int n;
scanf("%d%s",&n,s+1);
for(int i=1;i<=n;i++)scanf("%d",c+i);
dp[0][0][1]=dp[0][1][1]=1e18;
for(int i=1;i<=n;i++){
int k=s[i]-'0';
dp[i][k][0]=dp[i-1][k^1][0];
dp[i][k^1][0]=dp[i-1][k][0]+c[i];
dp[i][k][1]=min(dp[i-1][k][0],dp[i-1][k^1][1]);
dp[i][k^1][1]=min(dp[i-1][k^1][0],dp[i-1][k][1])+c[i];
}
printf("%lld",min(dp[n][0][1],dp[n][1][1]));
}