作者:匿名用户 链接:https://www.zhihu.com/question/322459441/answer/671735499 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 {L, W} = {3000, 1500}; {l, w} = {373, 201}; numberOfInterest = Select[Outer[Plus, Range[0, L, l], Range[0, L, w]] // Flatten // Sort, # <= L &]~Append~(L + 1) // DeleteDuplicates; noi = Rest@numberOfInterest; noiDict = Table[ConstantArray @@ seg, {seg, Transpose[{Most@numberOfInterest, Differences@numberOfInterest}]}] // Flatten; v = ConstantArray[-1, {L, L}]; Do[v[[j, i]] = v[[i, j]] = Floor[i/l] Floor[j/w], {i, 1, L}, {j, 1, l - 1}]; dp[i_, j_] := Module[{ii, jj, ik, jk}, If[v[[i, j]] >= 0, Return[v[[j, i]] = v[[i, j]]]]; If[v[[j, i]] >= 0, Return[v[[i, j]] = v[[j, i]]]]; {ii, jj} = noiDict[[{i, j} + 1]]; If[ii == i && jj == j, ik = Select[noi, (w <= # <= i - 1) &]; jk = Select[noi, (w <= # <= j - 1) &]; v[[j, i]] = v[[i, j]] = Max[ Table[dp[k, j] + dp[i - k, j], {k, ik}], Table[dp[i, k] + dp[i, j - k], {k, jk}], 1 ], v[[i, j]] = v[[j, i]] = dp[ii, jj] ] ]请根据这个代码写一个同样功能的pythion的代码
时间: 2023-08-18 07:47:49 浏览: 230
好的,这是一个 Python3 的实现:
```python
L, W = 3000, 1500
l, w = 373, 201
numberOfInterest = sorted(set([x for i in range(0, L+1, l) for x in range(i-l, i+1)]))
numberOfInterest = set(numberOfInterest) | set([x for i in range(0, W+1, w) for x in range(i-w, i+1)])
noiDict = {}
for i, pos in enumerate(numberOfInterest):
if i == len(numberOfInterest) - 1:
seg = [pos, L - pos]
else:
seg = [pos, numberOfInterest[i + 1] - pos]
noiDict.update(dict.fromkeys(range(seg[0], seg[0] + seg[1]), seg))
v = [[-1] * L for _ in range(L)]
def dp(i, j):
if v[i][j] >= 0:
return v[i][j]
if v[j][i] >= 0:
return v[j][i]
ii, jj = noiDict[i + 1], noiDict[j + 1]
if ii == i and jj == j:
ik = [k for k in noi if w <= k <= i - 1]
jk = [k for k in noi if w <= k <= j - 1]
v[i][j] = v[j][i] = max(
[dp(k, j) + dp(i - k, j) for k in ik] +
[dp(i, k) + dp(i, j - k) for k in jk] + [1]
)
else:
v[i][j] = v[j][i] = dp(ii, jj)
return v[i][j]
result = dp(L - 1, L - 1)
print(result)
```
这个代码与原始代码的差别主要在于:
1. 数组下标从 0 开始,因此在调用 dp 函数时需要将 i 和 j 减去 1。
2. 列表(list)和集合(set)的语法略有不同,需要根据 Python 的语法进行修改。
3. Python 的字典(dict)实现可以直接使用大括号来创建,而不需要调用 `dict.fromkeys()` 方法。
4. Python 的 print 函数默认会在输出之后添加一个换行符,需要注意这一点。
阅读全文