本文主要是介绍【状态机】atcoder 346 D,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
给一个长度为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;
}
这篇关于【状态机】atcoder 346 D的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!