Python:每日一题 349
本帖最后由 zltzlt 于 2020-3-11 13:34 编辑今天的题目:
在一个 m*n 的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于 0)。
可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格,直到到达棋盘的右下角。
给定一个棋盘 grid 包含每个礼物的价值,计算最多能拿到多少价值的礼物。
示例 1:
输入:
[
,
,
]
输出:12
解释:路径 1→3→5→2→1 可以拿到最多价值的礼物
{:10_298:}欢迎大家一起答题!{:10_298:} 高亮{:5_109:}而且有奇怪的字符 TJBEST 发表于 2020-3-11 13:31
高亮而且有奇怪的字符
这么快?{:10_268:}乱码已调整 感觉除了遍历没什么特别高效的算法{:10_243:} 找到一个好算法! 可是没有说每个单元格是多少价格呢 本帖最后由 TJBEST 于 2020-3-11 14:35 编辑
此法比较费空间,但是时间上还是不慢的。
def fun349(grid):
m = len(grid)
n = len(grid)
fuzhu = []
for index in range(0,m):
fuzhu.append()
minNum = min()
fuzhu=grid
for index in range(1,n):
fuzhu=fuzhu+grid
for index in range(1,m):
fuzhu=fuzhu+grid
for index in range(1,minNum):
for inner in range(index,n):
fuzhu=max(,fuzhu])+grid
for inner in range(index+1,m):
fuzhu=max(,fuzhu])+grid
return fuzhu TJBEST 发表于 2020-3-11 14:29
此法比较费空间,但是时间上还是不慢的。
人才啊{:5_106:} def f_349(lst: list) -> int:
# 创建与原数组相同大小的0数组,记录到lst所得到的最大值
max_value_lst = [ * len(i) for i in lst]
for i in range(len(lst)):
for j in range(len(lst)):
if i == 0 and j == 0:
# 记录初始值
max_value_lst = lst
else:
max_value_lst = max(max_value_lst, max_value_lst) + lst
return max_value_lst[-1][-1]
print(f_349([, , ])) def f(m,n):
if m == 0:
list1=[]
string = 'b'*n
list1.append(string)
return list1
else:
list3 = []
for each in f(m-1,n):
for number in range(len(each)+1):
list3.append(each[:number]+'a'+each)
return list3
def d(l):
list1 = list({}.fromkeys(f((len(l)-1),(len(l)-1))).keys())
count = []
for each in list1:
a = 0
b = 0
n = l
for value in each:
if value == 'a':
b += 1
n += l
else:
a += 1
n += l
count.append(n)
count.sort()
return count.pop()
print(d([,,]))
自己都有点看不下去{:10_266:} 本帖最后由 mdphd 于 2020-3-11 16:32 编辑
a = [
,
,
]
b = [*(max(len(a),len(a)))]*(min(len(a),len(a)))
if len(a) <= len(a):
b = a
else:
def transformMatrix(m):
r = [[] for i in m]
for ele in m:
for i in range(len(ele)):
r.append(ele)
return r
b = transformMatrix(a)
m, n = len(b), len(b)
c = b[:][:]
for x in range(1, m):
for i in range(1, x):
b = max(b, b) + c
b = b +c
b = b + c
for x in range(m, n):
for i in range(1, m):
b = max(b, b) + c
b = b + c
for x in range(n, m + n -1):
for i in range(x - n + 1, m):
b = max(b, b) + c
print(b)
这个算法在m,n很大时应该会很快 本帖最后由 蒋博文 于 2020-3-11 15:45 编辑
def fun349(s):
if not s:
return 0
a = len(s)
b = len(s)
maxs = * b
for i in range(0, a):
for j in range(0, b):
ma = 0
mb = 0
if i > 0:
mb = maxs
if j > 0:
ma = maxs
maxs = max(ma, mb) + s
return maxs
不好意思上传...
def f349(lst):
A, B = len(lst), len(lst)
t = 1
while t < B:
lst = lst + lst
t += 1
t = 1
while t < A:
lst = lst + lst
t += 1
for i in range(1, A):
for j in range(1, B):
lst = max(lst + lst, lst + lst)
return lst[-1][-1] kinkon 发表于 2020-3-11 15:57
不好意思上传...
思路可以啊, 有什么不好意思上传的 TJBEST 发表于 2020-3-11 14:29
此法比较费空间,但是时间上还是不慢的。
大佬,看了你的代码之后写的def f(list1,m,n):
if m>1 and n>1:
return max(f(list1,m-1,n),f(list1,m,n-1))+list1
if m==1 and n>1:
return f(list1,m,n-1)+list1
if m>1 and n==1:
return f(list1,m-1,n)+list1
if m==1 and n==1:
return list1
def d(list1):
return f(list1,len(list1),len(list1))
本帖最后由 flamezyy 于 2020-3-11 17:07 编辑
import itertools
def f349(grid):
last_m = len(grid)
last_n = len(grid)
product = last_m + last_n - 2
hor_num = last_n - 1
hor_combinations = []
result = []
for i in itertools.combinations(range(1,product+1),hor_num):
hor_combinations.append(i)
for p in hor_combinations:
i = 0
j = 0
sum = grid
for q in range(1,product+1):
if q in p:
j += 1
sum += grid
else:
i += 1
sum += grid
result.append(sum)
return max(result)
估计超时了 def f349(x):
back={(0,0):x}
I,J=len(x)-1,len(x)-1
def dp(i,j):
if (i,j) in back:
return back[(i,j)]
else:
a=b=0
if i>0:
a=dp(i-1,j)+x
if j>0:
b=dp(i,j-1)+x
back[(i,j)]=max(a,b)
return back[(i,j)]
return dp(I,J) 风魔孤行者 发表于 2020-3-11 16:23
大佬,看了你的代码之后写的
我这个思路随便用,有可能有更好的。互相交流吧 我个人认为对于函数传入的参数如果是列表等可更改的对象(不可hash的)还是在函数内生成一个备份。我看了大家都是 在传入的列表上面直接更改同时计算 这样原始列表数据也改了,这不符合编程规范。相当于用原始数据计算 同时有更改原始数据。我感觉不太好。 vidyhe 发表于 2020-3-11 14:27
可是没有说每个单元格是多少价格呢
这个格的值就是他的价格