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;
}
- Sorting Binary String Round 145sorting binary string round sorting binary string 题解sorting binary string codeforces sorting round cubes copying binary string codeforces sorting round 1839 educational codeforces binary string copying binary string 1849c 题解binary string 1837c codeforces shifting string round