1172. Ship Routes

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)));
	}

}

 

转载于:https://www.cnblogs.com/liulangye/p/3347429.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值