首页 > 其他分享 >【LOJ 3037】开关游戏(DP)

【LOJ 3037】开关游戏(DP)

时间:2023-01-13 01:33:34浏览次数:68  
标签:LOJ 3037 int 区间 变成 include DP

开关游戏

题目链接:LOJ 3037

题目大意

给你两个 01 串,分别是初始串和目标串,你可以有三种操作:选择一个区间,把区间里面的都变成 0/1,或者把区间里面的 01 反转。
问你最少要操作多少次把初始串变成目标串。

思路

考虑每个位置最后的结果会受什么印象。
首先是覆盖这个区间的操作,接着一个变成 \(0/1\) 的会取消前面所有的作用,那就是可能是前面有变成 \(0/1\),再配一个可能的翻转(因为两次的话就相当于抵消了,而且没有必要)

那你可以考虑从左往右考虑,直接记录当前点的覆盖状态(根据是否有覆盖和根据是否有翻转,一共 \(6\) 种状态)。
然后考虑从这个点的 \(x\) 状态到下一个点的 \(y\) 状态,要花费多少次数。
那这个因为是区间,所以我们是能继承就继承,要停止就停止,要新增才需要增加操作次数。(类似区间拆成扫描线)
不过要注意的是要判断当前状态是否能使得这个点变成目标串里面的数字。

代码

#include<cstdio>
#include<cstring>
#include<iostream>

using namespace std;

const int N = 1e6 + 100;
int n, a[N], b[N];
int f[N][3][2], ans;
//0:没有,1:强制变成0,2:强制变成1
//0:没有,1:翻转 

int main() {
	scanf("%d", &n);
	for (int i = 1; i <= n; i++) scanf("%1d", &a[i]);
	for (int i = 1; i <= n; i++) scanf("%1d", &b[i]);
	
	memset(f, 0x7f, sizeof(f)); ans = f[0][0][0]; f[0][0][0] = 0;
	for (int i = 1; i <= n; i++) {
		for (int j = 0; j <= 2; j++)
			for (int k = 0; k <= 1; k++) {
				for (int jj = 0; jj <= 2; jj++)
					for (int kk = 0; kk <= 1; kk++) {
						if (jj == 0 && ((a[i] ^ b[i]) ^ kk)) continue;
						if (jj != 0 && ((jj - 1) ^ kk) != b[i]) continue;
						int now = f[i - 1][j][k];
						if (jj && (jj != j)) now++;
						if (kk && !k) now++;
						f[i][jj][kk] = min(f[i][jj][kk], now);
					}
			}
	}
	
	for (int j = 0; j <= 2; j++)
		for (int k = 0; k <= 1; k++)
			ans = min(ans, f[n][j][k]);
	printf("%d", ans);
	
	return 0;
}

标签:LOJ,3037,int,区间,变成,include,DP
From: https://www.cnblogs.com/Sakura-TJH/p/LOJ_3037.html

相关文章

  • luogu P3518 [POI2011]SEJ-Strongbox | loj #2160. 「POI2011 R2 Day0」保险箱 Strong
    代码已在loj上不开O2通过。下文均在\(Z_n\)下考虑。首先,你考虑选出一些数,能组成的数。即ttps://www.cnblogs.com/xugangfan/p/17040634.html那么对于一个不在群......
  • DP
    DP是什么就我而言,DP是需要做出最优选择的一种题目,而且是全局最优的选择DP有个性质,是相关性,就后面做的决策可以在之前做的决策上进行而且没有后效性数组的下标代表状态,......
  • Trick 8:子集卷只因的 SOSDP 做法
    问题引入:对于两个数组\(a\),\(b\),长度为\(2^n\),从\(0\)开始标号。求\(c_i=\sum\limits_{p\&q=i}a_pb_q\)。关于这个问题的求解,我们可以使用SOSDP完成一系列......
  • 状压 DP
    概述状压DP是以状态含有某种意义上的状态压缩为特点的一类DP。所谓状态压缩,通常指的是将各个元素的状态从常规的vector等编码映射为一个\(id\)即抽象的状态。......
  • DP 套 DP
    概述DP套DP通过DP/DFS处理出某个复杂DP的状态集,构建出对应的DAG,从而将复杂DP的难度有效降低,有时还伴有降低时空复杂度的效果。其实我不是很认同这个名字。......
  • 树上分块解决限制距离的树上 DP 问题([NOI2014] 购票)
    [NOI2014]购票大家好,我喜欢暴力数据结构,所以我用分块过了此题。转移方程很简单:\[f_u=\min_{d_u-d_v\leql_u}{(d_u-d_v)\timesp_u+q_u+f_v}\]\[f_u=d_u\timesp_u+q......
  • python udp 接收图片并保存在本地
     疑问1.发送图片是以什么格式2.字节数据怎么保存到本地3.怎么对传输不同设备发送的图片进行分类存储4.udp实现解答1.以字节a.先用cv......
  • Oracle impdp使用content=data_only会阻塞其他会话DML操作
     Oracleimpdp使用content=data_only会阻塞其他会话DML操作 上篇提到了insert/*+append*/into会对表持有LOCKED_MODE=6的TM锁,导致其他对该表的DML都会被阻塞。实......
  • [NOIP2015 提高组] 子串 【计数dp】
    题面https://www.luogu.com.cn/problem/P2679分析CCF数据真的水。不过还是要写下正解:令\(dp[i][j][t][0/1]\)表示\(a\)串前\(i\)个字符,\(b\)串前\(j\)个字符,匹配子串数......
  • 数位 DP
    2023.1.9省选模拟赛IA【题意】给定\(x,y\),求\[\sum\limits_{i\in[0,2^k-x)}\sum\limits_{j\in[y,2^k)}[i\&j=0]\times[(i+x)\&(j-y)=0]\]\(......