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;
}