第一题:跳格子,动态规划 AC100%
def solution(step_list):
n = len(step_list)
dp = [-1 for i in range(n)]
dp[n-1] = 0
for i in range(n-1)[::-1]:
for j in range(1,step_list[i]+1):
if (i+j<n):
if(dp[i+j]!=-1):
if(dp[i]==-1):
dp[i] = 1+dp[i+j]
elif(dp[i]>1+dp[i+j]):
dp[i] = 1+dp[i+j]
return dp[0]
step_list = [int(i) for i in input().split()]
print(solution(step_list))
第二题:没测。报数出队
import collections
def solution(N,M):
fast = collections.OrderedDict().fromkeys(range(1,N+1))
no = 1
i = 0
while(len(fast.keys())>0):
pop = False
if (no==M):
k = list(fast.keys())[i]
fast.pop(k)
print(k)
pop = True
no = (no%M) +1
if not pop:
i = i+1
if(i>=len(fast.keys())-1 and len(fast.keys())!=0):
i = i%(len(fast.keys()))
N,M = [int(i) for i in input().split()]
solution(N,M)
第三题:回溯法:两个矿车装石头,两边石头数量不能超过1,两边尽量平衡,求最小重量差,AC 90%
def slove_meta(stone_list,A,B,i,N):
if(i>N or len(A)>(N+1)//2 or len(B)>(N+1)//2):
return -1
if(i==N):
return abs(sum(A)-sum(B))
else:
if i==0:
A.append(stone_list[i])
a = slove_meta(stone_list,A,B,i+1,N)
A.remove(stone_list[i])
return a
else:
A.append(stone_list[i])
a = slove_meta(stone_list,A,B,i+1,N)
A.remove(stone_list[i])
B.append(stone_list[i])
b = slove_meta(stone_list,A,B,i+1,N)
B.remove(stone_list[i])
if a!=-1 and b!=-1:
return min(a,b)
elif a!=-1:
return a
elif b!=-1:
return b
else:
return -1
def solution(stone_list):
N = len(stone_list)
return slove_meta(stone_list,[],[],0,N)
stone_list = [int(i) for i in input().split()]
print(solution(stone_list))