PAT 顶级 1017 The Best Peak Shape (35分)(最长上升子序列)
题目链接: 1017 The Best Peak Shape (35分) 思路: 1.LIS(Longest Increasing Subsequence)是动态规划里的一个基本类型,我们需要掌握它的 O ( n log n ) O(n\log n) O ( n lo g n ) 的算法;(不会的朋友自行学习~) 2.其基本操作就是每次二分dp数组,往里面写值,如果 a[i] 被写到dp [k] ,就说明以这个值为结尾的LIS最长是 k+1 ; 3.我们则需要计算出对于每个点,以它为末尾的正向LIS和反向LIS的长度为多少即可; 代码: # include <bits/stdc++.h> using namespace std ; const int maxn = 10005 ; const int INF = 1 << 30 ; int n , a [ maxn ] , dp [ maxn ] , l [ maxn ] , r [ maxn ] ; void solve ( ) { fill ( dp , dp + n , INF ) ; for ( int i = 0 ; i < n ; i ++ ) { l [ i ] = lower_bound ( dp , dp + n , a [ i ] ) - dp ; dp [ l [ i ] ] = a [ i ] ; }