题面
\(n\)个球队,两两比赛,胜得\(3\)分,平各得\(1\)分。告知每队最后得分,询问有多少种不同比赛结果。
我一开始的想法是把搜索的状态设为各组当时的得分(\(28^{10}\)爆不了\(long\ long\))。 然而这样就不能记忆化了,因处理(加)得分时不知道两个队是否比赛过,强设该状态又炸空间。
于是还是枚举每场比赛的结果吧。
当然,可以有剪枝:
- 将各组最终得分从大到小排序,然后\(n对[1,n-1],(n-1)对[1,n-2],...,(2)对[1,1]\)枚举比赛状态,如果发现前者分数用(扣)不完就\(return\)。
- 用\(dp[i]\)记忆化 前面比赛完的人的分数 为\(i\)(二十八进制数转十进制)后的方案数。(只有这样设状态才知道哪些队没比赛过)
还有值得注意的一点,\(dp\)数组初始值应该设为\(-1\),这样才能同已经计算过、方案数为\(0\)的情况区分开来。
#include #include #include #include #include #include #include