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

Download