给一个长度为n的01字符串s,可以进行操作:
将0变成1,1变成0,操作的成本为 ci ;
求将s变成好字符串的最小成本。
好字符串:s[i] 和 s[i+1] 只有一对相同。
#include<iostream>
#include<set>
using namespace std;
typedef long long LL;
const int N=2e5+10;
LL c[N];
LL ldp[2][N];//ldp[k][i]:表示从1~i,相邻两位不同且第i个字符为k的最小价值
LL rdp[2][N];//rdp[k][i]:表示从i~n,相邻两位不同且第i个字符为k的最小价值
int main(){
int n;
cin>>n;
string s;
cin>>s;
s=' '+s;
for(int i=1;i<=n;i++) cin>>c[i];
for(int i=1;i<=n;i++){
if(s[i]=='0'){
ldp[0][i]=ldp[1][i-1];
ldp[1][i]=ldp[0][i-1]+c[i];
}else{
ldp[0][i]=ldp[1][i-1]+c[i];
ldp[1][i]=ldp[0][i-1];
}
}
for(int i=n;i>=1;i--){
if(s[i]=='0'){
rdp[0][i]=rdp[1][i+1];
rdp[1][i]=rdp[0][i+1]+c[i];
}else{
rdp[0][i]=rdp[1][i+1]+c[i];
rdp[1][i]=rdp[0][i+1];
}
}
LL minv=1e20;
for(int i=1;i<n;i++){
//让第i个和第i+1个字符相同
minv=min(minv,ldp[0][i]+rdp[0][i+1]);
minv=min(minv,ldp[1][i]+rdp[1][i+1]);
}
cout<<minv<<endl;
return 0;
}