今天360笔试C++第三题怎么做?

看了一圈都没人发,3号笔试的一批很冷么?
K种玫瑰花摆在N个位置上,要求每种花至少出现一次,求方法数。K不大于30,N不大于50000。我的思路是先K个位置上各放1种,然后有K!*C(K, N)种,但是发现会有很多重复的可能。于是只能暴力dfs剪枝,只过了20%。#C++工程师##360公司##笔试题目##面经#
全部评论
感谢楼上回复,我还是太水了,算法练习得少,写得不好。 关于2楼,我通过率是20%而该层主通过率40%的原因,刚才重写时也许找到了,我的代码逻辑错了。比如DFS到第i层,假如K种花都已经放过了,那么就可以不用继续递归了,剩下N-i层每一层都可以放K种花,也就是结果加上K的N-i次方。由于我是按照N=3 K=2来作为示例,所以这里我加上了2的N-i次方。 关于动归的思路,应该是f(n, k) = k*(f(n-1, k-1) + f(n-1, k)。设花的种类为1~k,f(n-1, k-1)可以看作前n-1个位置放置花种1~k-1的种数,然后第n个位置必须放置花种k。由于轮换对称性,第n个位置的花种k可以和任意花种兑换,因此要乘以k。f(n-1, k)则可以看作前n-1个位置就放置了所有的花种,因此肯定和前面的k*f(n-1, k-1)的放置放法是不同的。当然这里也要乘以k,因为第n个位置还是能放置k种花。
点赞 回复 分享
发布于 2018-04-04 03:49
dp吧 dp[n][k] = dp[n-1][k-1] + dp[n-1][k] * k
点赞 回复 分享
发布于 2018-04-04 01:13
容斥了解一下
点赞 回复 分享
发布于 2018-04-04 00:34
我dfs过40
点赞 回复 分享
发布于 2018-04-04 00:41
3号有巨人 美图 华为 360 人都分开了
点赞 回复 分享
发布于 2018-04-04 00:58
高中插空法了解一下
点赞 回复 分享
发布于 2018-04-04 06:37
第二类斯特林数了解下
点赞 回复 分享
发布于 2018-04-04 09:03

相关推荐

点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务