PAT甲级——Favorite Color Stripe(最长不下降子序列问题)
最长不下降子序列问题(Longest Increasing Sequence,LIS) 在一个数字序列中,找到一个最长的子序列(可以不连续),使得这个子序列是不下降(非递减)的。 分析: 例如现有序列A={1,2,3,-1,-1,7,9}(下标从1开始),它的最长不下降子序列是 {1,2,3,7,9},长度为5。用枚举的方法是可以求出结果的,但是每个元素选取或者不选取有两种选择,那么时间复杂度会是 ,这是不能接受的。这里令dp[i]表示以i结尾的最长不下降子序列长度,在开始的时候 全部初始为1 。当A[j]<A[i](j<i)时,如果dp[j]+1>dp[i],那么就将dp[i]更新为dp[j]+1。但是如果A[i]之前的元素都比它大,那么A[i]就只能自己形成一条LIS,但是长度为1,即这个子序列里面只有A[i]一个元素。 要注意的是,A[i]必须和它前面的每一个元素进行比较,因为前面每一个元素的dp[j]都会对dp[i]产生可能的更新! 比如一个序列{1,5,-1,3}(下标从 1开始),A[2]=5>A[1]=1,dp[1]+1=2>dp[2]=1,那么就更新dp[2]=2;由于-1比它前面的数都小,那么dp[3]就只能是1,A[3]自己构成一个子序列;A[4]>A[1],且dp[1]+1>dp[4],那么更新dp[4]=2,A[4]<A[2],不进行子序列长度更新,A[4]