python - 动态编程 - 可能的密码数量
问题描述
我有一个动态规划问题。我觉得这很困难,所以我希望能得到一些帮助。
给定单词列表和n
密码长度,我想知道可能的密码组合数量。密码可以是单个长度的单词,也可以是n
由下划线分隔的单词组合。
例如,passwords(5, ["house, "no"]) = 2
因为可能的密码是“house”和“no_no”。
到目前为止我已经尝试过:
def voc_to_list(vocabulary):
"""
produces a list lengths such that lengths[i] is the number of
words of length i in vocabulary
"""
max_len = max([len(w) for w in vocabulary])
lengths = [0] * (max_len + 1)
for w in vocabulary:
wordLength = len(w)
lengths[wordLength] += 1
return lengths
def passwords(L, vocabulary):
lengths = voc_to_list(vocabulary)
k = len(lengths)
tbl = [0] * (L + 1)
for i in range(L + 1):
if i < k:
tbl[i] = lengths[i]
for j in range(min(i, k)):
# This is where I am stuck
tbl[i] += ??
return tbl[L]
里面tbl[i]
我已经有长度的话了i
。我被困在如何填写表格以考虑单词组合。
解决方案
您应该tbl[i]
使用 length 存储最大数量的可能密码i
,这就是您已经想出来的。更新步骤涉及组合学。一个简单的例子是passwords(9, ["a", "e", "i", "o", "u"]) == 5**5
. 如果这对您来说不直观,我建议重新审视所需的数学。
因此,更新步骤实际上是最大组合数与“完成”密码长度到该点的新词候选的乘积之和。为此,您迭代更新:tbl[i-j-1]
lengths[j]
def passwords(L, vocabulary):
lengths = voc_to_list(vocabulary)
k = len(lengths)
tbl = [0] * (L + 1)
for i in range(L + 1):
if i < k:
tbl[i] = lengths[i]
for j in range(1, min(i-1, k)):
tbl[i] += tbl[i-j-1] * lengths[j] # -1 due to underscores
return tbl[L]
推荐阅读
- c++ - 如何限制字符输入范围?
- gmail - 电子邮件标记在 G Suite 的主题行中不显示按钮(它在 Gmail 中有效)
- typescript-typings - 如何更新旧版本的类型
- python - Tensorflow 和 Keras 实现之间的比较(第 1 部分:模型)
- python - 这个警告在 PATE 分析中意味着什么?
- haskell - 我可以像文字似乎能够“返回” Num a 一样“返回” Num a 吗?
- variables - Shopify 变量以在感谢页面中获取客户电子邮件
- c# - 带有 C# 和位桶的自动 git 克隆脚本
- echo - Echo show 5 使用内置摄像头录制视频
- jupyter-notebook - 使用 Papermill 在 Notebook 中执行 get_ipython 代码时出现问题