[Pregunta Solución] LuoGu3943: Cielo estrellado

El portal de título original
porque k <= 8 k <= 8k<=8 así que piensa en

La idea principal es
hacer que la luz se atenúe a 1 y la luz a 0. Por
ejemplo, el caso de una fila de luces es
a: 01001100 a: 01001100una:0 1 0 0 1 1 0 0
Entonces la matriz de diferencias correspondiente es
b: 011010100 b: 011010100si:0 1 1 0 1 0 1 0 0
可以 发现ai = b 1 xorb 2 xor. . . xorbi a_i = b_1xorb_2xor ... xorb_iunayo=si1x o r b2x o r . . . x o r byo
Luego, para el intervalo [l, r] [l, r][ l ,r ] realiza la operación de inversión, el rendimiento en la matriz de diferencias es
bl = blxor 1, br + 1 = br + 1 xor 1 b_l = b_lxor1, b_ {r + 1} = b_ {r + 1} xor1sil=silx o r 1 ,sir + 1=sir + 1x o r 1

El problema se puede transformar en bbb matriz se convierte en todo 0
encuentrabbEl número de la matriz b 1 debe ser un número par y como máximo2 k 2k2 K th
concebible para eliminar cada dos 1, para eliminar el costo de ambos se presiona un predeterminado por el siguiente estado

Si quieres poner 10000001 100000011 0 0 0 0 0 0 1 se convierte todo 0, pero solo
puedocambiarla longitud a 3, 4pueden primero00010001 000100010 0 0 1 0 0 0 1 significa[1, 3] [1, 3][ 1 ,3 ] Voltear de
nuevo00000000 000000000 0 0 0 0 0 0 0 significa[4, 7] [4, 7][ 4 ,7 ] Voltee para
indicar que la diferencia entre los dos esxxx de111. Para cambiarlos a 0, elijax = b 1 + b 2 + ... + Byx = b_1 + b_2 + ... + b_yX=si1+si2+. . .+siy
Son posibles múltiples combinaciones de volteretas

O poner 00110000 001100000 0 1 1 0 0 0 0 se convierte en ceros, pero solo
puedocambiarla longitud a 3, 4puede primero00010010 000100100 0 0 1 0 0 1 0 significa[3, 6] [3, 6][ 3 ,6 ] Voltear de
nuevo00000000 000000000 0 0 0 0 0 0 0 significa[4, 6] [4, 6][ 4 ,6 ] La inversión
muestra que la resta entre las longitudes de los intervalos de inversión también es posible

Entonces, por una cierta longitud, pase bbPuede obtener su propia longitud sumando, sumando, restando y restando la matriz b . Encuentre el número mínimo de volteretas en una situación razonable y consígalo en una mochila completa

Código:

#include <bits/stdc++.h>
#define maxn 40010
#define maxm 100010
using namespace std;
int a[maxn], dp[maxm], cost[maxn], b[maxn], pos[maxn], power[25], tot, n, m, k;

inline int read(){
    
    
	int s = 0, w = 1;
	char c = getchar();
	for (; !isdigit(c); c = getchar()) if (c == '-') w = -1;
	for (; isdigit(c); c = getchar()) s = (s << 1) + (s << 3) + (c ^ 48);
	return s * w;
}

int main(){
    
    
	n = read(), k = read(), m = read();
	for (int i = 1; i <= k; ++i){
    
    
		int x = read();
		a[x] ^= 1, a[x + 1] ^= 1;
	}
	for (int i = 1; i <= n; ++i) cost[i] = 1e9;
	for (int i = 1; i <= m; ++i) b[i] = read();
	for (int i = 1; i <= m; ++i)
		for (int j = b[i]; j <= n; ++j) cost[j] = min(cost[j], cost[j - b[i]] + 1);
	for (int i = 1; i <= m; ++i)
		for (int j = n - b[i]; j >= 0; --j) cost[j] = min(cost[j], cost[j + b[i]] + 1);
	for (int i = 1; i <= n + 1; ++i)
		if (a[i]) pos[++tot] = i;
	power[0] = 1;
	for (int i = 1; i <= 20; ++i) power[i] = power[i - 1] << 1;
	for (int i = 1; i < power[tot]; ++i) dp[i] = 1e9;
	for (int i = 0; i < power[tot]; ++i)
		for (int j = 1; j <= tot; ++j)
			if (!(i & power[j - 1]))
				for (int k = j + 1; k <= tot; ++k)
					if (!(i & power[k - 1]))
						dp[i | power[j - 1] | power[k - 1]] = min(dp[i | power[j - 1] | power[k - 1]], dp[i] + cost[pos[k] - pos[j]]);
	printf("%d\n", dp[power[tot] - 1]);
	return 0;
}

Supongo que te gusta

Origin blog.csdn.net/ModestCoder_/article/details/108491966
Recomendado
Clasificación