NOI 2.6 动态规划 9280:[Spoj]严格n元树

题目来源:https://www.lydsy.com/JudgeOnline/problem.php?id=1089

1089: [SCOI2003]严格n元树

Time Limit: 1 Sec  Memory Limit: 162 MB

Description

  如果一棵树的所有非叶节点都恰好有n个儿子,那么我们称它为严格n元树。如果该树中最底层的节点深度为d

(根的深度为0),那么我们称它为一棵深度为d的严格n元树。例如,深度为2的严格2元树有三个,如下图:

NOI 2.6 动态规划 9280:[Spoj]严格n元树_第1张图片

  给出n, d,编程数出深度为dn元树数目。

 

Input

  仅包含两个整数n, d( 0   <   n  <   =   32,  0  < =   d < = 16)

 

Output

  仅包含一个数,即深度为dn元树的数目。

 

Sample Input

【样例输入1

2 2

【样例输入2

2 3

【样例输入3

3 5

Sample Output

【样例输出1

3

【样例输出2

21

【样例输出2

58871587162270592645034001

-----------------------------------------------------

解题思路

高精度+动态规划

dp[i]:深度小于等于i的严格n元树的个数

深度小于等于i的严格n元树的根节点连接n棵深度小于等于(i-1)的严格n元子树,再加上一棵只有根节点的树

dp[i]= dp[i-1]^n+1

深度等于i的严格n元子树ans[i] =dp[i]-dp[i-1]

-----------------------------------------------------

代码

/*
 * 高精度+动态规划
 * dp[i]: 深度小于等于i的严格n元树的个数
 * 深度小于等于i的严格n元树的根节点连接n棵深度小于等于(i-1)的严格n元子树,再加上一棵只有根节点的树
 * dp[i] = dp[i-1]^n+1
 * 深度等于i的严格n元子树ans[i] = dp[i]-dp[i-1]
 */

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

public class Main {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		int d = sc.nextInt();
		BigInteger[] dp = new BigInteger[d+1];			// 可变大小的对象数组
		dp[0] = new BigInteger("1");					// 用String构造BigInteger对象
		// 深度为0,只有一个根节点
		int i = 0;
		for (i=1; i<=d; i++)
		{
			dp[i] = dp[i-1].pow(n).add(new BigInteger("1"));
		}
		if (d==0)
		{
			System.out.println(1);
		}
		else
		{
			System.out.println(dp[d].subtract(dp[d-1]));
		}
	}
}


你可能感兴趣的:(NOI)