HDU1502 Regular Words

链接: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();
}
}
}
上一篇:Java多线程-----volatile关键字详解


下一篇:URAL1018 Binary Apple Tree(树dp)