timus 1172. Ship Routes URAL 解題報告
import java.io.*;
import java.math.BigInteger;
import java.util.*;
public class Main4 {
static int N=33;
static BigInteger big1=BigInteger.ONE;
static BigInteger big0=BigInteger.ZERO;
static BigInteger big2=BigInteger.valueOf(2);
static BigInteger dp[][][][]=new BigInteger[N][N][N][3];
static int n,k;
public static void main(String[] args) throws IOException {
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
init(n);
System.out.println((dp[n][n][n][1].add(dp[n][n][n][2])).divide(big2));
}
static void init(int n){
for(int i=0;i<=32;++i){
for(int j=0;j<=32;++j){
for(int k=0;k<=32;++k){
for(int t=0;t<3;++t){
dp[i][j][k][t]=big0;
}
}
}
}
dp[1][0][0][0]=big1;
for(int i=1;i<=n;++i){
for(int j=0;j<=n;++j){
for(int k=0;k<=n;++k){
for(int t=0;t<3;++t){
if(t==0){
dp[i][j+1][k][1]= dp[i][j+1][k][1].add( dp[i][j][k][t].multiply(BigInteger.valueOf(n-j)) );
dp[i][j][k+1][2]= dp[i][j][k+1][2].add( dp[i][j][k][t].multiply(BigInteger.valueOf(n-k)) );
}else if(t==1){
dp[i+1][j][k][0]= dp[i+1][j][k][0].add( dp[i][j][k][t].multiply(BigInteger.valueOf(n-i)) );
dp[i][j][k+1][2]= dp[i][j][k+1][2].add( dp[i][j][k][t].multiply(BigInteger.valueOf(n-k)) );
}else if(t==2){
dp[i+1][j][k][0]= dp[i+1][j][k][0].add( dp[i][j][k][t].multiply(BigInteger.valueOf(n-i)) );
dp[i][j+1][k][1]= dp[i][j+1][k][1].add( dp[i][j][k][t].multiply(BigInteger.valueOf(n-j)) );
}
}
}
}
}
}
}
timus 1172. Ship Routes URAL 解題報告