http://acm.hdu.edu.cn/showproblem.php?pid=1502
catalan数,可以直接套公式
这里居然有DP方程,太神了
dp[i][j][k]=dp[i-1][j][k]+dp[i][j-1][k]+dp[i][j][k-1];
i-1>=j>=k,i>=j-1>=k,i>=j>=k-1 这里要分别讨论
初始化也是个问题
catalan数,可以直接套公式
这里居然有DP方程,太神了
dp[i][j][k]=dp[i-1][j][k]+dp[i][j-1][k]+dp[i][j][k-1];
i-1>=j>=k,i>=j-1>=k,i>=j>=k-1 这里要分别讨论
初始化也是个问题
方程解释一下,dp[i][j][k]等于A放最后一个,B放最后一个,C放最后一个的状态的和
这里要用大数来写,因为n有60,顺便学习了一下java的大数
代码:
import java.util.*;
import java.math.*;
public class Main
{
public static void main(String[] args)
{
int n;
Scanner in=new Scanner(System.in);
while(in.hasNextInt())
{
n=in.nextInt();
solve ma=new solve(n);
System.out.println(ma.Cal(n));
System.out.println();
}
}
}
class solve
{
private BigInteger dp[][][];
public solve(int n)
{
dp=new BigInteger [n+1][n+1][n+1];
dp[1][1][1]=BigInteger.valueOf(1);
dp[0][0][0]=BigInteger.valueOf(1);
dp[1][0][0]=BigInteger.valueOf(1);
dp[0][1][0]=BigInteger.valueOf(0);
dp[0][0][1]=BigInteger.valueOf(0);
dp[1][1][0]=BigInteger.valueOf(1);
dp[0][1][1]=BigInteger.valueOf(0);
dp[1][0][1]=BigInteger.valueOf(0);
}
public BigInteger Cal(int n)
{
for(int i=2;i<=n;i++)
for(int j=0;j<=i;j++)
for(int k=0;k<=j;k++)
{
BigInteger m=new BigInteger("0");
if(i-1>=j&&j>=k)
{
m=m.add(dp[i-1][j][k]);
}
if(i>=j-1&&j-1>=k&&j-1>=0)
{
m=m.add(dp[i][j-1][k]);
}
if(k-1>=0)
m=m.add(dp[i][j][k-1]);
//System.out.println(i+" "+j+" "+k+" "+m);
dp[i][j][k]=m;
}
return dp[n][n][n];
}
public BigInteger getB(int n)
{
return dp[n][n][n];
}
public BigInteger getA(int x,int y,int z)
{
return dp[x][y][z];
}
}