描述
给定两个数组,由数字 0-9 组成的,长度分别为 a 和 b,需要用 a、b 两个数组中的数字组合得到长度为 k (k <= a+b)的正整数,输出所有可能的组合中数值最大的一个(原同一数组中的数字顺序不能改变)
Solution
\(f_{i,j,k}\)表示第一个串到第\(i\)个位置, 第二个串到第\(j\)个位置, 一共取了\(k\)个
有毒啊
是不是我Python
姿势不对啊
好像做了一点点常数优化就过了
Code
def solution(line):
tmp = line.split(' ')
a = tmp[0].split(',')
b = tmp[1].split(',')
k = min(len(a) + len(b), int(tmp[2]))
f = []
n1 = len(a)
n2 = len(b)
f = []
for i in range(n1):
a[i] = int(a[i])
for j in range(n2):
b[j] = int(b[j])
for i in range(n1 + 1):
f.append([])
for j in range(n2 + 1):
f[i].append([])
for k in range(k + 1):
f[i][j].append(0)
for i in range(1, n1 + 1):
f[i][0][1] = a[i - 1]
for j in range(1, n2 + 1):
f[0][j][1] = b[j - 1]
for i in range(n1 + 1):
for j in range(n2 + 1):
for k in range(1, k + 1):
if i > 0:
f[i][j][k] = max(f[i][j][k], max(f[i - 1][j][k], f[i - 1][j][k - 1] * 10 + a[i - 1]))
if j > 0:
f[i][j][k] = max(f[i][j][k], max(f[i][j - 1][k], f[i][j - 1][k - 1] * 10 + b[j - 1]))
return f[n1][n2][k]