CF1739E - Cleaning Robot
首先机器人显然不会向左走。设计 dp,\(f _ {i, u, v}\) 表示做到第 \(i\) 列,走到第 \(i\) 列之前在第 \(u\) 行,第 \(i\) 列垃圾放置状态为 \(v\)。
题目中不合法等价于不能出现以下情况及其上下翻转:

故转移时枚举 \(i + 1\) 列的垃圾放置情况 \(w\),然后你发现 \(u, v, w\) 这些信息已经足够你判掉不合法的情况了。
#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 200005
using namespace std;
int n,ans,f[N][2][4];
char s[2][N];
int main() {
scanf("%d%s%s",&n,s[0]+1,s[1]+1);
memset(f,0xc0,sizeof(f));
f[0][0][0]=0;
for(int i=1;i<=n;i++) {
for(int u=0;u<=1;u++) {
for(int v=0;v<=3;v++) {
int c=v==0?u:v==1?0:v==2?1:!u;
for(int w=0;w<=3;w++) {
if(w&1&&(s[0][i]=='0'||v&2&&u==0)) continue;
if(w&2&&(s[1][i]=='0'||v&1&&u==1)) continue;
f[i][c][w]=max(f[i][c][w],f[i-1][u][v]+(w&1)+(w>>1&1));
}
}
}
}
for(int u=0;u<=1;u++) for(int v=0;v<=3;v++) ans=max(ans,f[n][u][v]);
printf("%d\n",ans);
return 0;
}

浙公网安备 33010602011771号