美团春招笔试总结

涉及到子序列的基本都要考虑前缀和

n=int(input())
l=list(map(int,input().split()))
sum=[0]*(n+1)                        #在0号位预留个0
res=0
for i in range(1,n+1):
    sum[i]=sum[i-1]+(l[i-1]==-1)     #记录该元素(包括)前共有几个-1
for i in range(1,n+1):
    for j in range(i,n+1):
        if (sum[j]-sum[i-1])%2==0:   #计算区间内-1的个数
            res+=1
print(res)

 

需要一个状态列表,记录每个菜是否可提供;当过程中有不同种选择时,考虑深度优先遍历

n,m=map(int,input().split())
a=[0]*n
b=[0]*n
for i in range(n):
    a[i],b[i]=map(int,input().split())       #记录每位用户点菜情况
res=0
flag=[1]*(m+1)                               #状态列表
def dfs(i,cur):
    if i==n:
        global res
        res=max(res,cur)
        return
    if flag[a[i]] and flag[b[i]]:            #每个人的两道菜同时满足
        flag[a[i]]=0
        flag[b[i]]=0
        dfs(i+1,cur+1)
        flag[a[i]]=1
        flag[b[i]]=1
    dfs(i+1,cur)
dfs(0,0)
print(res)

 

看到第一秒是给定的初始状态,每一秒的结果都在上一秒的基础上操作,考虑dp

n,m=map(int,input().split())
tmp=list(map(int,input().split()))
bomb=[0]
bomb.extend(tmp)
INF=10**8
dp=[[INF]*(n+2) for _ in range(m+2)]
dp[1][1]=0
for i in range(2,m+1):
    for j in range(1,n+1):
        if j==bomb[i]:
            continue
        for k in range(1,n+1):           #遍历上一时间点找最小值填入
            t=0 if k==j else 1
            dp[i][j]=min(dp[i][j],dp[i-1][k]+t)
res=INF
for i in range(1,n+1):
    res=min(res,dp[m][i])
print(res)

 

posted @ 2022-03-22 16:39  Aria_2000  阅读(155)  评论(0)    收藏  举报