题解:CF1739E Cleaning Robot
Cleaning Robot
考虑
- 如果
i,j\oplus 1 有但是第i+1 列都没有。
两种选择,将另一行上的手动清理掉,或者不清理,让机器人自己转移到另一行。
(对应同颜色路径)
- 如果
i,j\oplus 1 和i+1,j\oplus 1 有,但i+1,j 没有。
和
- 如果
i,j\oplus 1 和i+1,j 有,但i+1,j\oplus1 没有。
此时出现了矛盾点,必须清除其中的一个。
- 如果这三处地方都有。
这时我们有三条路线,两种情况。
如果我不想换行,就说明我要把另外两个都手动删掉。
否则我可以选择从上面绕,还是从下面绕
但是不难发现,橙色的路线存在问题,就是如果在问号所在地有一处垃圾,那就说明
同时我们依然存在情况二的蓝色路径。
综上转移即可。
\text{CODE}
#include<bits/stdc++.h>
#define N 200005
using namespace std;
int read()
{
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
int n,mp[N][3],f[N][3],sum;
int main()
{
n=read();
for(int i=1;i<=n;i++)mp[i][0]=getchar()-'0';
getchar();
for(int i=1;i<=n;i++)mp[i][1]=getchar()-'0';
for(int i=1;i<=n;i++)sum+=mp[i][0]+mp[i][1];
for(int i=n-1;i>=0;i--)
{
for(int j=0;j<2;j++)
{
if(mp[i][j^1]==0)f[i][j]=f[i+1][j];
else
{
if(mp[i+1][j]==0)f[i][j]=min(f[i+1][j^1],f[i+1][j]+1);
else if(mp[i+1][j^1]==0)f[i][j]=min(f[i+2][j],f[i+2][j^1])+1;
else f[i][j]=min(f[i+2][j]+2,f[i+2][j^1]+1);
}
}
}
cout<<sum-f[1][0]<<"\n";
return 0;
}