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;
}
posted @ 2025-12-31 10:01  yemuzhe  阅读(2)  评论(0)    收藏  举报