一、题目链接
http://aiiage.hustoj.com/problem.php?id=1005
二、题面
PDF:http://aiiage.hustoj.com/upload/file/20180114/20180114145400_75397.pdf
三、思路
正赛时,我一开始写了个感觉在O(N*N*k)的时间复杂度内做了优化的代码,交上去,TLE。尝试了各种可能的情况,还是TLE。赛后,看了官方题解。如下:
然而,2.3的“相对直观的想法”,实在是没想到一个时间复杂度在O(N*k*k)的DP算法。
后来,队友问了其他一位AC的同学,他给我们仔细地讲了如何做DP推导。我算是听明白了。具体如下:
1、改掉题解中dp数组的意义。dp[i][j][k]表示:在模k意义下,到达结点i距离为j的结点的个数。
2、修改dp的含义后,设置两个dp数组:
dp1[3001][101][101]。dp1[i][j][k]表示在以i为根的子树中,在模k意义下到达结点i的距离为j的结点的个数。
dp[3001][101][101]。dp[i][j][k]表示,在模k意义下,到达结点i距离为j的结点的个数。
3、dp1数组的递推式不难想到,假设当前结点为root:dp1[root][j][k] = Σdp1[soni][j - w][k]。