【建兰情人节专赛】一二题解题报告

T1:情人树

题目:

她非常喜欢梧桐树,这些树种植在一片园子里。在园子里,每一棵树可以产生2棵树苗。这些树和树苗之间的关系我们采用用一个二叉树来表示。总共有n棵树,也就是有n个节点,每个节点的度只能是0或者2。同时,二叉树的高度是已经定好的值是k,根节点的高度是1。例如,当n=5,k=3时,只有两种不同形态的种植树。

样例输入:

5 3

样例输出:

2

样例解释:

 

分析:

算法:动态规划

虽然很难看出来这是动态规划,但是我们仔细看题目,我们可以发现一组n和k是唯一的。所以对应的形态是固定的。每一棵二叉树都是由它的子树来决定它的形态的数量。换句话说,就是我们求出了子树的形态,我们就可从两棵树的数量得到答案。

既然是动态规划,我们就定义状态,因为是三个变量,我们设置一个而且数组,用f[i][j]表示i的节点,j的高度可以得到的最大的数量。

转移方程:f[i][j]=(f[i][j]+f[k][j-1]*f[i-k-1][j-1])我们就是要枚举一个k,根据乘法原理,算出左右子树的数量,再相乘,得到答案。

初始:f[1][i]都为1,因为只有一个点,所以只有一种形态。

答案:f[n][k]-f[n][k-1]

源码:

T2:情人行

题目:

小A来到了一个城市,这个城市有n个可疑的地点,在这个地点可能会有她的存在。每个地方的地方都是1--n,其中有一些地方之间会有一条有向边连接,而且图没有环。初始的时候,小A在编号1的地方,他的重点是n号点的位置。因为他要查找她到底在哪里,所以他想尽量多的通过一些地点,来找她。虽然是为爱而献身,但是小A还是有一定的精力,设为T。 现在请你计算从起点到终点中途最多可以查找多少个地方(包括起点和终点)。在不超过T的情况下,同时输出一条字典序最小的路线,中间每个编号用一个空格空开。如果没有路径符合要求,那么就输出-1。

样例输入:

4 3 13
1 2 5
2 3 7

2 4 8

样例输出:

3

1 2 4

分析:

算法:图论

首先我们看到数据范围,因为n≤5000,得有一种意识:邻接矩阵开不下,我们需要挂链表。

然后我们设置两个数组,f[i][j]和g[i][j],f表示i到j的最短距离,然后g记录路径。

然后进行搜索,搜索头上的点,然后计算的时候在把路径记录下来,在递归输出路径就可以了。

源码:

挂链表:

搜索:

递归输出:

主程序:

猜你喜欢

转载自blog.csdn.net/Phantom_stars/article/details/79330571
今日推荐