hdu 1502 Reglar Wods DP+高精度第一弾java
1308 ワード
最後の文は実際には見なくてもいいです。この文字列の各接頭文字列は、n(a)>=n(b)>=n(c)を覚えていればいいです。
作り方:状態dp[i][j][k],iのプレフィックス列には、j個のA,K個のBがあります。
作り方:状態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();
}
}
}