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记录路径。
然后进行搜索,搜索头上的点,然后计算的时候在把路径记录下来,在递归输出路径就可以了。
源码:
挂链表:
搜索:
递归输出:
主程序: