链接:http://acm.hdu.edu.cn/showproblem.php?pid=1502
思路:当只有两个数时,可以用卡特兰数做,当三个数时,没想到卡特兰数的做法。可以使用动态规划。
状态转移方程如下:
dp[i][j][k] = dp[i - 1][j][k] + dp[i][j - 1][k] + dp[i][j][k - 1]
代码如下:
import java.math.BigInteger; import java.util.Scanner; public class Main{ public static void main(String[] args){ Scanner cin =new Scanner(System.in); BigInteger dp[][][] = new BigInteger[61][61][61]; dp[0][0][0] = BigInteger.ZERO; for(int i = 0; i < 2; i++){ for(int j = 0; j <= i; j++){ for(int k = 0; k <= j; k++){ dp[i][j][k] = BigInteger.ONE; } } } int n; while(cin.hasNext()){ n = cin.nextInt(); for(int i = 2; i <= n ; i++){ for(int j = 0; j <=i; j++){ for(int k = 0; k <= j; k++){ dp[i][j][k] = BigInteger.ZERO; if(i - 1 >= j){ dp[i][j][k] = dp[i][j][k].add(dp[i - 1][j][k]); } if(j - 1 >= k){ dp[i][j][k] = dp[i][j][k].add(dp[i][j - 1][k]); } if(k - 1 >= 0){ dp[i][j][k] = dp[i][j][k].add(dp[i][j][k - 1]); } } } } System.out.println(dp[n][n][n]); System.out.println(); } } }