1、身高体重排序
2、寻找停车位
3、垃圾信息拦截
动态规划类题目
1、士兵过河
def shorter_time(a,b):
return a*10 if a*10<b else b
if __name__ == "__main__":
N = int(input())
t = int(input())
time_list = sorted(map(int,input().split()))
L = len(time_list)
dp = [0]*L
#这里注意,直接利用time_list[0]判断与t的关系
if time_list[0] > t:
print("0 0")
#这里注意需要else
else:
dp[0] = time_list[0]
#这里注意加判断条件if n > 1
if L > 1:
dp[1] = shorter_time(time_list[0],time_list[1])
if dp[1] > t:
print(f"0 {dp[0]}")
else:
for i in range(2,L):
#两种情况,i-1未过河与i-1过河,注意需要加前面的这个dp[i-2]与dp[i-1],第一个未过河这里,最后是+shorter_time(dp[0],dp[1]),这里还是要判断一下,不可直接写成dp[1]
dp[i] = min(dp[i-2]+time_list[0]+shorter_time(time_list[i-1],time_list[i])+dp[1]+shorter_time(dp[0],dp[1]),dp[i-1]+time_list[0]+
shorter_time(time_list[0],time_list[i]))
if dp[i] > t:
print(f"{i} {dp[i-1]}")
break
else:
print(f"{L} {dp[L-1]}")
2、机智的外卖员
五步法分析动态规划
1、确定dp数组以及下标的含义。 2、确定递推公式 3、dp数组如何初始化 4、确定遍历顺序 5、举例推导dp数组
N,M = map(int,input().split())
if N>M:
print(0)
exit
#1、确定dp数组以及下标的含义。dp[i]代表到达第i层需要的最短时间
dp = [0]*(M+1)
for i in range(1,N + 1):
dp[i] = N - i
for i in range(N+1,M+1):
if i % 2 == 0:
#要注意这里的dp[i//2]+1,后面是+1
dp[i] = min(dp[i-1]+1,dp[i//2]+1)
else:
dp[i] = min(dp[i-1]+1,dp[(i+1)//2]+2)
print(dp[M])