【华为OD】2024年C、D卷真题集:最新的真题集题库 C/C++/Java/python/JavaScript
【华为OD】2024年C、D卷真题集:最新的真题集题库 C/C++/Java/python/JavaScript-CSDN博客
JS、python、Java、C++、C代码:
【华为OD】D卷真题100分:最长连续子序列 JavaScript代码实现[思路+代码]-CSDN博客
【华为OD】D卷真题100分:最长连续子序列 python代码实现[思路+代码]-CSDN博客
【华为OD】D卷真题100分:最长连续子序列 Java代码实现[思路+代码]-CSDN博客
【华为OD】D卷真题100分:最长连续子序列 C++代码实现[思路+代码]-CSDN博客
【华为OD】D卷真题100分:最长连续子序列 C语言代码实现[思路+代码]-CSDN博客
题目描述:
有N个正整数组成的一个序列。给定整数sum,求长度最长的连续子序列,使他们的和等于sum,返回此子序列的长度,如果没有满足要求的序列,返回-1。
输入描述
序列:1,2,3,4,2
sum:6
输出描述
序列长度:3
示例1
输入输出示例仅供调试,后台判题数据一般不包含示例
输入
1,2,3,4,2
6
输出
3
说明
解释:1,2,3和4,2两个序列均能满足要求,所以最长的连续序列为1,2,3,因此结果为3
示例2
输入输出示例仅供调试,后台判题数据一般不包含示例
输入
1,2,3,4,2
20
输出
-1
说明
解释:没有满足要求的子序列,返回-1
备注
输入序列仅由数字和英文逗号构成,数字之间采用英文逗号分隔;
序列长度:1 <= N <= 200;
输入序列不考虑异常情况,由题目保证输入序列满足要求。
34334
+---+
3 | | ++ + +---|
| | | 3 + 6 + | + | +
| + | | + + + | + | +
| + | +---+ + + +++++ + + + | +
| + | + | + +----+ | | + + + | +
| + 3 | + | + + + 2 | | 2 + + + | +
| + | + | + + + | | + + + | +
| +---+ + | | | + ----+ | +---+ | | + | +
| | + | | | + | | | | | | + | +
| 1 | + | 8 | | + 1 | | | 1 | | 1 | | + | +
| | + | | | + | | | | | | | + | +
| +---+ + +---+ | ++---+ ++ +---+ +---+ | + | +
| | + | | | ++ | | |+ | +
|0 | + | 0 | 0 | ++ | 0 | |+ | +
| | + | | | ++ | | |+ | +
+---+ + +-------+ +---+| +|+ | +
+ + | +
0 1 2 3 4 5 6 7 8 9 10 11 12 + v: w u m u 1 0 2 4
题目解析:
按逻辑来加上动态规划处理即可
代码实现:
def get_max(nums, target):
max_len = 0
dp = [0] * len(nums)
for i in range(1, len(nums)):
dp[i] = dp[i - 1] + nums[i]
for j in range(i):
if dp[i] - dp[j] == target and max_len < i - j:
max_len = i - j
return max_len
if __name__ == '__main__':
ss = input()
target = int(input())
nums = [int(i) for i in ss.split(",")]
nums.insert(0, 0)
res = get_max(nums, target)
if res == 0:
print(-1)
else:
print(res)