VKNIGHTS - Quân mã
Tác giả: khuc_tuan
Ngôn ngữ: Java
import java.util.*;
import java.math.*;
public class Main {
static int[][] hs = {{4,2},{3,5},{4,0}};
static boolean check(int b, int nb) {
for(int i=0;i<3;++i) if((nb&(1<<i))!=0) {
for(int t=0;t<2;++t) if((b&(1<<(hs[i][t])))!=0) return false;
}
return true;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] Z = new int[n];
for(int i=0;i<n;++i) Z[i] = sc.nextInt();
long[][][] F = new long[n+1][151][1<<6];
F[0][0][0] = 1;
for(int i=0;i<n;++i) for(int b=0;b<(1<<6);++b) for(int sm=0;sm<F[i].length;++sm) if(F[i][sm][b]>0) {
for(int nb=0;nb<(1<<3);++nb) if(check(b, nb)) {
int dem = 0;
boolean ok = true;
for(int j=0;j<3;++j) if((nb&(1<<j))!=0) {
++dem;
if(j+1==Z[i]) ok = false;
}
if(ok) {
F[i+1][sm+dem][((b&7)<<3)|nb] += (F[i][sm][b]);
}
}
}
for(int sm=F[n].length-1;sm>=0;--sm) {
long total = 0;
for(int b=0;b<(1<<6);++b) total += (F[n][sm][b]);
if(total>0) {
System.out.println(sm+" " +total);
break;
}
}
}
}