CF EC Round 145 D. Binary String Sorting

发布时间 2023-03-24 15:19:02作者: Liang2003

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;
}