同学问了这个问题,当时的思路是记忆化搜索,因为这很像一棵树,计数其叶子节点。递归的记忆化搜索是很容易实现的,只是考虑到N<=10000,也就是说所搜层数会达到10000层,对于之前一直接触Pascal的我有些接受不了,所以考虑非递归的DFS。因为闲麻烦,索性先敲了一个递归的DFS,提交试试,没想到过了。
具体是这样的:
先给每个科目一个编号:政治(0),地理(1),历史(2),综合(3)。
用f[step][obj]表示在第step层中科目obj这课子树的叶子节点数(即从第step层的科目obj开始到第n层结束会有多少种情况),那么如果i是obj的孩子节点(考完科目obj后有可能会考i),那么f[step][obj] = (f[step][obj] + f[step+1][i]) % 7654321,当然,f[step+1][i]是递归时的返回值,最后输出f[1][0]就可以了。
#include<stdio.h>
#include<string.h>
int f[10010][4];
int next[4][4] = {