CF EC Round 145 D. Binary String Sorting
D
题意
给一个01串,交换两个数需要花费\(10^{12}\),删除某个数需要花费\(10^{12}+1\),问最少花费多少使得串单调不降
思路
线性dp,\(f[i][0]\)表示前i位构建的串结尾为0,单调不降的花费,\(f[i][1]\)同理,\(f[i][2]\)表示前i位构建的串结尾1的个数多于1的花费。
代码
void solve()
{
string s;
cin>>s;
n=s.size();
s=" "+s;
int c1=1e12,c2=c1+1;
for(int i=1;i<=n;i++)
{
if(s[i]=='0')
{
f[i][0]=f[i-1][0];
f[i][1]=f[i-1][1]+c1;
f[i][2]=f[i-1][2]+c2;
}
else
{
f[i][0]=f[i-1][0]+c2;
f[i][1]=f[i-1][0];
f[i][2]=min(f[i-1][1],f[i-1][2]);
}
}
cout<<min(min(f[n][0],f[n][1]),f[n][2])<<endl;
}