欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

1172. Ship Routes

程序员文章站 2022-05-22 11:34:33
...

http://acm.timus.ru/problem.aspx?space=1&num=1172

水题DP   大整数直接上java

代码:

import java.math.BigInteger;
import java.util.Scanner;

public class Main {

	/**
	 * @param args
	 */
	static final int N = 35;

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner in = new Scanner(System.in);
		BigInteger[][][][] dp = new BigInteger[N][N][N][4];
		int n = in.nextInt();
		for (int i = 0; i <= n; ++i) {
			for (int j = 0; j <= n; ++j) {
				for (int l = 0; l <= n; ++l) {
					for (int k = 1; k <= 3; ++k) {
						dp[i][j][l][k]=BigInteger.ZERO;
					}
				}
			}
		}
		dp[0][0][0][1] = BigInteger.ONE;
		for (int i = 0; i <= n; ++i) {
			for (int j = 0; j <= n; ++j) {
				for (int l = 0; l <= n; ++l) {
					for (int k = 1; k <= 3; ++k) {
						if (dp[i][j][l][k].compareTo(BigInteger.ZERO) == 1) {
							if (k != 1 && i < n) {
								dp[i + 1][j][l][1] = dp[i + 1][j][l][1]
										.add(dp[i][j][l][k].multiply(BigInteger
												.valueOf(Math.max(1, n - i - 1))));
							}
							if (k != 2 && j < n) {
								dp[i][j + 1][l][2] = dp[i][j + 1][l][2]
										.add(dp[i][j][l][k].multiply(BigInteger
												.valueOf(n - j)));
							}
							if (k != 3 && l < n) {
								dp[i][j][l + 1][3] = dp[i][j][l + 1][3]
										.add(dp[i][j][l][k].multiply(BigInteger
												.valueOf(n - l)));
							}
						}
					}
				}
			}
		}
		System.out.println(dp[n][n][n][1].divide(BigInteger.valueOf(2L)));
	}

}