360算法笔试0920

四十道选择题,数学,数据结构,代码,cv等等。

code1:

len(nums)=n的数组,数组划分为k段后,求各段权重之和的最大值。

动态规划,感觉很难,很难想到怎么构造dp状态和转移方程

最后还有注意去重

n,k = map(int, input().split())
arr = list(map(int,input().split()))

sum_val = [[0]*n for _ in range(n)]
for l in range(n):
    seen = set()
    total = 0
    for r in range(l,n):
        if arr[r] not in seen:
            total += arr[r]
            seen.add(arr[r])
        sum_val[l][r] = total
dp = [[0]*(k+1) for _ in range(n+1)]
for i in range(1,n+1):
    dp[i][1] = sum_val[0][i-1]

for j in range(2,k+1):
    for i in range(j,n+1):
        best=-10**18
        for m in range(j-1,i):
            current_Val = dp[m][j-1] + sum_val[m][i-1]
            if current_Val > best:
                best = current_Val
        dp[i][j] = best
print(dp[n][k])

code2:

import sys
input_ = sys.stdin.read().split()
idx = 0
T = int(input_[idx])
idx += 1
for _ in range(T):
    n = int(input_[idx])
    idx+=1
    if n==0:
        print(0)
        continue
    h = list(map(int,input_[idx:idx+n]))
    idx += n
    if n==1:
        print(1)
        continue
    
    left = [1]*n
    for i in range(1,n):
        if h[i] > h[i-1]:
            left[i] = left[i-1]+1
        
    right = [1]*n
    for i in range(n-2,-1,-1):
        if h[i]<h[i+1]:
            right[i]=right[i+1]+1
    
    ans = max(left)
    if n >1:
        ans = max(ans,1+right[1])
    if n >1:
        ans = max(ans,1+left[n-1])
    for i in range(1,n-1):
        if h[i-1]<h[i+1] and h[i+1]-h[i-1]>=2:
            ans = max(ans,left[i-1]+1+right[i+1])
        else:
            ans = max(ans,left[i-1]+1,right[i+1]+1)
    print(ans)    

全部评论
四十道题好多
点赞 回复 分享
发布于 10-10 23:19 四川
第一题用的贪心,比dp好想一点
点赞 回复 分享
发布于 09-20 21:56 四川

相关推荐

09-20 16:45
祝余杜若:1.45/2,第二题不会啊
投递360集团等公司10个岗位
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务