携程笔试第一场题解
1.直接模拟
2.从小到大排序,从后往前遍历i,每次取i~n这段数组看看答案会不会更大,即不断更新ans=max(ans, a[i] + n - i + 1)。
3.先预处理每个数的质因子个数a[i]。对a数组求前缀和。然后枚举长度为k的滑动窗口往后移动,更新答案
4.树形dp,记dp[i]为从结点i往下走的路径为偶数的方案数。可以发现,只有所有数都为偶数时,这些数的gcd才可能为偶数,因此只需要判断数的奇偶性就行,不用去算gcd。dfs每个结点u,枚举以u为路径最高点时路径为偶数的方案数,累加起来就是答案。对于每个偶数结点u,dp[u]=u的儿子的dp和 + 1,这样就完成了dp的更新;累加答案的话,就是枚举u的每个儿子dp[i],和他左边儿子的dp和sum,ans+=sum*dp[i],然后sum+=dp[i],因为以u为最高点的话,u左边和u右边的路径是可以组合起来的;
第四题可能讲的不是很清楚,但属于树形dp挺常见的类型
2.从小到大排序,从后往前遍历i,每次取i~n这段数组看看答案会不会更大,即不断更新ans=max(ans, a[i] + n - i + 1)。
3.先预处理每个数的质因子个数a[i]。对a数组求前缀和。然后枚举长度为k的滑动窗口往后移动,更新答案
4.树形dp,记dp[i]为从结点i往下走的路径为偶数的方案数。可以发现,只有所有数都为偶数时,这些数的gcd才可能为偶数,因此只需要判断数的奇偶性就行,不用去算gcd。dfs每个结点u,枚举以u为路径最高点时路径为偶数的方案数,累加起来就是答案。对于每个偶数结点u,dp[u]=u的儿子的dp和 + 1,这样就完成了dp的更新;累加答案的话,就是枚举u的每个儿子dp[i],和他左边儿子的dp和sum,ans+=sum*dp[i],然后sum+=dp[i],因为以u为最高点的话,u左边和u右边的路径是可以组合起来的;
第四题可能讲的不是很清楚,但属于树形dp挺常见的类型
全部评论
第四题思路一样,但是只过了5%
可以问一下第四题为什么偶数个奇数之和不满足条件吗?
相关推荐

点赞 评论 收藏
分享
点赞 评论 收藏
分享