#include<iostream>
using namespace std;
const int N = 2e5 +10;
int num[N];
char ch[N];
int dp[N][2];//dp[i][0]表示选择num[i], dp[i][1]表示不选择num[i]
int main(){
int t;
cin>>t;
while(t--){
int n;
cin>>n;
scanf("%s", ch+1);
for(int i=1; i<=n; i++) {
scanf("%d", &num[i]);
}
for(int i=1; i<=n; i++){
dp[i][0] = dp[i][1] = max(dp[i-1][0], dp[i-1][1]);//如果没有盖子,也就是无法选择num[i],就直接继承前一个的最大值
if(ch[i] == '1'){//如果num[i]可选择
dp[i][0] = dp[i][0] + num[i];//如果选择num[i],那就是前一个的最大值+num[i]
dp[i][1] = max(dp[i][1], dp[i-1][1] + num[i-1]);//如果不选num[i],而是选择前一个
}
}
printf("%d\n", max(dp[n][0], dp[n][1]));
}
return 0;
}
Educational Codeforces Round 137 (Rated for Div. 2) C. Save the Magazines
最新推荐文章于 2024-07-04 17:35:22 发布