问题描述:
小蓝在蓝桥大街开了一家零售店,他将每天的流水记录在电脑上。在每天开始营业时,商店里没有商品。如果他进了一件商品,那就在电脑上记录1,如果卖出了一件商品,就在电脑上记录-1。对于电脑上的记录,有着这样的要求:
1.在一天结束后,要求商品数恰好为0
2.当卖出商品时,商店里必须有商品。
例如111-1-1-1是符合要求的记录,1-1 -1 1是不符合要求的记录。
但是现在小蓝不小心将每一天的记录混合在一起,形成了一个很长的记录,他现在想知道这个记录里面,有多少个记录是合法记录,你可以帮助他吗? 换句话说,这个由1-1构成的序列中,有多少个连续子序列是合法的。
输入格式:
第一行一个n表示总记录的数量
第二行n个由1-1构成的序列
输出格式:
输出一行一个整数,表示合法的连续子序列数量。
样例输入:
样例输出:
标签:记录,python,top,卖货,stk,ans,列表,dp From: https://blog.csdn.net/2302_77624868/article/details/136917029import os import sys n = int(input()) # 获取一个整数输入 s = list(map(int, input().split(" "))) # 获取一个以空格分隔的整数列表 n = len(s) # 更新变量 n 的值为列表 s 的长度 N = int(2e5+10) # 定义常量 N 的值为 2 * 10^5 + 10 dp = [0] * N # 初始化一个长度为 N 的列表 dp,每个元素初始值为 0 stk = [0] * N # 初始化一个长度为 N 的列表 stk,每个元素初始值为 0 top = 0 # 初始化变量 top 的值为 0 ans = 0 # 初始化变量 ans 的值为 0 for i in range(1, n+1): # 遍历列表 s 的每个元素,i 从 1 到 n+1 if s[i-1] == 1: # 如果 s[i-1] 的值为 1 stk[top+1] = i # 将 i 存入 stk 列表的下一个位置 top = top+1 # 增加 top 的值 elif top > 0: # 如果 top 的值大于 0 dp[i] = dp[stk[top]-1] + 1 # 更新 dp[i] 的值为 dp[stk[top]-1] + 1 top = top-1 # 减小 top 的值 ans = ans + dp[i] # 更新 ans 的值为 ans + dp[i] print(ans) # 输出变量 ans