这是代码:
from functools import lru_cache
@lru_cache(None)
def f(l,d,s):
if l==12:
return (len(d)==12 and (all(int(d[i],16)%2!=int(d[i+1],16)%2) \
for i in range(len(d)-1)))
if l<12 and all(d[-1]<=h for h in s):return 0
else:
return sum(f(l+1,d+j,s=s.replace(j,"")) for j in s if j<d[-1])
print(sum(f(1,d,"0123456789abcdef") for d in "fedcb"))
我必须计算出有多少个十六进制十二位数字,其中数字按降序排列,偶数与奇数交替。
不需要递归或迭代算法。正如评论中提到的,限制是这样的,您需要计算有多少种方法可以从
'fedcba9876543210'
中删除 4 个字符,并且由于奇/偶约束,您需要删除两个 连续对。例如,您可以删除“ba”和“65”,但不能删除“d”、“9”、“4”、“0”(因为这违反了奇/偶约束)。
对于最左边的连续对,我们有 12 个选择:“fe”、“ed”、“de”、...、“43”、“32”(我们不能选择“21”或“10”,因为这样就没有选择)第二对的选择)。
对于最右边的一对,当我们为第一对选择“fe”时,我们有 12 个选项,当我们选择“ed”时,我们有 11 个选项,...等等。
所以选项总数是 12 + 11 + 10 + ... + 2 + 1。这是一个三角数,所以我们有一个封闭的解决方案公式:12*13/2 = 78。否需要一个程序。