题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1502
Problem Description
Consider words of length 3n over alphabet {A, B, C} . Denote the number of occurences of A in a word a as A(a) , analogously let the number of occurences of B be denoted as B(a), and the number of occurenced of C as C(a) .
Let us call the word w regular if the following conditions are satisfied:
A(w)=B(w)=C(w) ;
if c is a prefix of w , then A(c)>= B(c) >= C(c) .
For example, if n = 2 there are 5 regular words: AABBCC , AABCBC , ABABCC , ABACBC and ABCABC .
Regular words in some sense generalize regular brackets sequences (if we consider two-letter alphabet and put similar conditions on regular words, they represent regular brackets sequences).
Given n , find the number of regular words.
Let us call the word w regular if the following conditions are satisfied:
A(w)=B(w)=C(w) ;
if c is a prefix of w , then A(c)>= B(c) >= C(c) .
For example, if n = 2 there are 5 regular words: AABBCC , AABCBC , ABABCC , ABACBC and ABCABC .
Regular words in some sense generalize regular brackets sequences (if we consider two-letter alphabet and put similar conditions on regular words, they represent regular brackets sequences).
Given n , find the number of regular words.
Input
There are mutiple cases in the input file.
Each case contains n (0 <= n <= 60 ).
There is an empty line after each case.
Each case contains n (0 <= n <= 60 ).
There is an empty line after each case.
Output
Output the number of regular words of length 3n .
There should be am empty line after each case.
There should be am empty line after each case.
Sample Input
2 3
Sample Output
5 42
Source
题意是求长度为3*n的串中前缀中A的个数大于B的个数大于C的个数。。用dp[i][j][k]表示前缀串符合的个数,则有状态转移方程:
dp[i][j][k]=dp[i-1][j][k]+dp[i][j-1][k]+dp[i][j][k-1]
java代码:
//package eg1;
import java.io.*;
import java.util.*;
import java.math.*;
public class Main
{
public static void main(String args[])
{
BigInteger f[][][]=new BigInteger[62][62][62];
Scanner cin=new Scanner(System.in);
f[0][0][0]=BigInteger.ONE;
for(int i=1;i<=60;i++)
for(int j=0;j<=i;j++)
for(int k=0;k<=j;k++)
{
f[i][j][k]=BigInteger.valueOf(0);
if(i>j)
f[i][j][k]=f[i][j][k].add(f[i-1][j][k]);
if(j>k)
f[i][j][k]=f[i][j][k].add(f[i][j-1][k]);
if(k>0)
f[i][j][k]=f[i][j][k].add(f[i][j][k-1]);
}
int n;
while(cin.hasNext())
{
n=cin.nextInt();
System.out.println(f[n][n][n]);
System.out.println();
}
}
}