El algoritmo Lanqiao Cup ADV-151 mejora el pensamiento de resolución de problemas de Flower War.

Para los datos de 70, enumere directamente la persona correspondiente a cada niña usando la permutación completa y luego resuélvalo para obtener el valor máximo. La complejidad del tiempo es O (n * n!). datos de 100, podemos usar el método de compresión de estado para la programación dinámica:

Dp[i][j] significa que ahora yo y las mujeres estamos involucrados, y la identidad del estudiante que ocupa el asiento es la más grande sistema de j.

¿El estado j se expresa en binario y el k-ésimo bit es 1? Significa que el késimo estudiante ha sido ocupado.

Por ejemplo, j=3, el número binario es 0000011, lo que indica que los estudiantes 1 y 2 ya están ocupados.

Para el estado inicial:

dp[0][j]=0

La ecuación de transferencia es:

DP[I ][j]= max(DP[I-1][k] como[I][t])?

Donde t es la posición 1 de 1 en J, y k es el número en el que J cambia la posición t-ésima a 0. Encuentre el valor máximo en un lado de todos t y luego como [i] [t], ¿cuál es dp [i] [j]?

La respuesta es DP [n] [2 n-1]

La complejidad del tiempo debe ser o (n * 2 n)

Considerando todo solo I relacionado con i-1, que puede reducir el consumo de espacio unidimensional.

Para n

Finalmente, publica un código nuevo que acabas de escribir:

#include? ltiostream gt

#¿Contiene? ltcstdio gt

#¿Contiene? ltcstring gt

#¿Contiene? lt algoritmo gt

#¿Definición? ¿MAXN? 15

¿Uso? ¿Espacio de nombres? estándar

const? int? maxzt =(1 lt; lt13);? //Número máximo de estados,

int? DP[maxzt];

int? Como [MAXN][MAXN], n;

int? númeroDeUno(int?num){? //núm? Número binario 1.

int? CNT = 0;

mientras(núm){

CNT = (núm amp; 1);

núm gt gt=1; p>}

¿Volver? cnt

}

int? bit bajo(int?x){//num? ¿Mantener solo el último 1 en binario? Por ejemplo:? número=20? ¿Binario 10100? ¿devolver? El 100 binario es 4.

¿Volver? x amp(-x);

}

int? posOfOne(int?núm){? //núm? La posición del último 1 en binario es la siguiente:? número=18? ¿Binario 10010? ¿devolver? 2

int? pos = 0;

mientras(núm){

pos ;

si (número amp1)

¿Regresar? pos

num gt gt=1;

}

¿Devolver? pos

}

¿No es válido? trabajo(int?x){

int? estado máximo = 1 lt;

for(int?I = 0; i ltmaxstatusi){

int? nowstatus=i, t = número de uno(now status);

If (t!=x)? continuar;? //x mujer tiene x 1. Si no, continúa buscando el siguiente número.

mientras(t - ){

int? pos = bit bajo (ahora estado);

dp[i]=max(dp[i], DP[I-pos] like[x][posOfOne(pos)]);

ahora estado-= pos;

}

}

}

int? main(){

scanf("d ", ampn);

para(int? I = 1; i lt= n; i)

para (int?j=1;j lt=n;j)

scanf("d", amp como [I][j]);

memset(dp, 0, sizeof(DP));

for(int?I = 1;i lt= n;i)

Trabajo(1);

printf(" d\n ",DP[(1 lt; ltn)-1]);

¿Volver? 0;

}