![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
AcWing LIS相关问题
皓首不倦
算法爱好者 码农一枚 欢迎志同道合 技术爱好者加微信CODER-GRH 非技术人员勿扰
展开
-
AcWing LIS相关问题 187 导弹防御系统
''' DFS枚举所有可能的元素放到上升序列或者下降序列的情况 ''' ans = [0x7fffffff] # 最小序列总数 up = [0] * 60 # 上升序列的尾数数值 down = [0] * 60 # 下降序列的尾数数值 # 当前安排第i个数值,上升序列有up_cnt个,下降序列有down_cnt个情况下最少的总序列个数 def dfs(arr, i, up_cnt, down_cnt): if up_cnt + down_cnt >= ans[0]:.原创 2020-07-24 13:31:07 · 125 阅读 · 0 评论 -
AcWing LIS相关问题 贪心策略求解 1010. 拦截导弹
import bisect # 最长严格上升子序列长度 def get_lis_len(arr): lst = [] for i in range(len(arr)): idx = bisect.bisect_left(lst, arr[i]) if idx >= 0 and idx < len(lst): lst[idx] = arr[i] else: lst.append(a..原创 2020-07-20 22:20:10 · 100 阅读 · 0 评论 -
AcWing LIS 相关问题 1016 最大上升子序列和
''' 简单动态规划 O(N^2)时间复杂度 ''' N = int(input()) arr = list( map(int, input().split()) ) # dp[i]表示所有以i位置结尾的上升子序列中最大的和 dp = [val for val in arr] ans = max(0, dp[0]) for i in range(1, N): dp[i] = arr[i] for j in range(i-1, -1, -1): if arr[j] &..原创 2020-07-20 15:03:13 · 100 阅读 · 0 评论 -
AcWing LIS相关问题 1012 友好城市
''' 本质上还是LIS问题,变了一下形 过现在序列有两个,而且两个序列存在一一映射关系 可以看成一个序列的两个维度,先按照第一个维度进行排序,保证第一个维度 一定从左往右选是上升的,然后只需要用LIS的套路,求第二个维度的LIS长度 即可,需要一点思路的转换 ''' import bisect N = int(input()) arr = [] for _ in range(N): a, b = map(int, input().split()) arr.append( (a, ..原创 2020-07-20 14:23:21 · 95 阅读 · 0 评论 -
ACWing LIS相关问题 482 合唱队形
''' 跟1014 登山是同一道题,只不过最后答案是总数减去嫌憎后降的序列的最长长度 ''' import bisect # 求每一个位置结尾的最长递增子序列的长度列表 def get_lis_len_arr(arr): lst = [] ans = [] for i in range(len(arr)): idx = bisect.bisect_left(lst, arr[i]) if idx >= 0 and idx < le..原创 2020-07-20 14:07:20 · 78 阅读 · 0 评论 -
AcWing LIS 相关问题 1014 登山
''' 转换为LIS 问题解决,其实问题是要找一个点,这个点左边的数据和其组成上升序列 右边的数和其组成下降序列,两个序列的长度和的最大值就是答案,正向和反向两次 求出每个位置结尾的LIS的长度即可求解 ''' import bisect # 求每一个位置结尾的最长递增子序列的长度列表 def get_lis_len_arr(arr): lst = [] ans = [] for i in range(len(arr)): idx = bisect.bise..原创 2020-07-20 13:51:24 · 95 阅读 · 0 评论 -
AcWing LIS 相关问题 1017 怪盗基德的滑翔翼
''' LIS 问题的变形,能找到LIS 就对应一个严格下降序列 正向和反向分别求LIS长度取最大值即可 ''' import bisect def get_lis_len_simple(arr): lst = [] for i in range(len(arr)): idx = bisect.bisect_left(lst, arr[i]) if idx >= 0 and idx < len(lst): lst[id.原创 2020-07-20 13:27:35 · 116 阅读 · 0 评论