题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1502
题意:有A,B,C三字符各N个,问你有多少种排列满足:在前i个字符下有num(A) > num(B) > num(C)
思路:dp[i][j][k]代表当前状态下有i个A,j个B,k个C,在尾部添加新字符时,为了保证构造合法,应该先加A,再加B,最后加C,dp[i][j][k]由dp[i - 1][j][k],dp[i][j - 1][k],dp[i][j][k - 1]三个状态转移而来
import java.io.*;
import java.util.*;
import java.math.*;
public class Main {
public static void main(String[] args) {
BigInteger [][][]dp = new BigInteger [70][70][70];
Scanner cin = new Scanner(System.in);
dp[0][0][0] = BigInteger.valueOf(1);
for (int i = 1; i <= 60; i++)
for (int j = 0; j <= i; j++)
for (int k = 0; k <= j; k++) {
dp[i][j][k] = BigInteger.valueOf(0);
if (i > j) dp[i][j][k] = dp[i][j][k].add(dp[i - 1][j][k]);
if (j > k) dp[i][j][k] = dp[i][j][k].add(dp[i][j - 1][k]);
if (k > 0) dp[i][j][k] = dp[i][j][k].add(dp[i][j][k - 1]);
}
while (cin.hasNext()) {
int n = cin.nextInt();
System.out.println(dp[n][n][n]);
System.out.println();
}
}
}