题意:最后一句话其实可以不看的,只要记得这个字符串中每个前缀子串,n(a) >= n(b) >= n(c)
做法:状态 dp[i][j][k],i 的前缀串中,有j个A,K个B
import java.util.*;
import java.math.*;
import java.io.*;
public class Main
{
public static void main(String[] args)
{
int i, j, k;
BigInteger[][][] dp = new BigInteger[183][63][63];
for( i = 0; i < 183; ++i)
for(j = 0; j < 63; ++j)
for( k = 0; k < 63; ++k)
dp[i][j][k] = BigInteger.valueOf(0);
Scanner cin = new Scanner(System.in);
dp[1][1][0]=BigInteger.valueOf(1);
for(i=2;i<=180;i++)
for(j=0;j<=60&&j <=i;j++)
for(k=0;k<=j && j + k <=i;k++)
if(k >= i - j -k)
{
if(i > 0)
dp[i][j][k]=dp[i - 1][j][k];
if(j > 0)
dp[i][j][k]=dp[i][j][k].add(dp[i-1][j-1][k]);
if(k > 0)
dp[i][j][k]=dp[i][j][k].add(dp[i-1][j][k - 1]);
}
int n = 0;
while(cin.hasNext())
{
n=cin.nextInt();
System.out.println(dp[n*3][n][n]);
System.out.println();
}
}
}