【题目描述】
n只球队打锦标赛,两两之间进行一场比赛,胜积3分,平积1分,负积0分,现在给出n只球队最后的得分,问可能的比赛结果有多少种?
【输入输出】
n (2 <= n <= 8)
n行,每行一个整数,表示某队的得分
输出可能的结果数
下面是样例
3
3
3
3
2
-------------------------------
Possible table number 1
Team | A | B | C | Points |
A | - | 3 | 0 | 3 |
B | 0 | - | 3 | 3 |
C | 3 | 0 | - | 3 |
Possible table number 2
Team | A | B | C | Points |
A | - | 0 | 3 | 3 |
B | 3 | - | 0 | 3 |
C | 0 | 3 | - | 3 |
【题目分析】
看到这么小的n,很自然的想到枚举,每场比赛有三种结果,枚举每场比赛的结果的话,不太现实。
可以先拿出来一个球队,枚举这个球队和剩下的n - 1支球队的战绩,然后就可以假设把这支球队删掉,然后递归求解n - 1支球队,n = 2的时候为递归的出口。
这样的话,就可以用记忆化来剪枝,如果有n个球队的得分表为table的种数已经计算过了,就存在map里备用。
按这个思想敲了下代码,跑了下
8
10
10
10
10
10
10
10
10
这组数据,花了20S,好在结果是正确的。
优化。。。
1. n支球队的得分表是没有顺序,所以先排个序(升序)。
2. 在1的基础上,我们先枚举得分最少的那个队,如果这个队的得分是0,那么很明显,它都输了,这样就省得枚举了,而且这个时候其他队的得分要至少是3
3. 不可能有两支球队的得分同时为0,搜索的时候用这个剪下枝,不过好像作用不是很大
优化之后再跑那个数据,32MS,交之,AC,截止发稿前暂列status第一
【code】