1. 程式人生 > >[Python](PAT)1045 Favorite Color Stripe (30 分)

[Python](PAT)1045 Favorite Color Stripe (30 分)

Eva is trying to make her own color stripe out of a given one. She would like to keep only her favorite colors in her favorite order by cutting off those unwanted pieces and sewing the remaining parts together to form her favorite color stripe.

It is said that a normal human eye can distinguish about less than 200 different colors, so Eva's favorite colors are limited. However the original stripe could be very long, and Eva would like to have the remaining favorite stripe with the maximum length. So she needs your help to find her the best result.

Note that the solution might not be unique, but you only have to tell her the maximum length. For example, given a stripe of colors {2 2 4 1 5 5 6 3 1 1 5 6}. If Eva's favorite colors are given in her favorite order as {2 3 1 5 6}, then she has 4 possible best solutions {2 2 1 1 1 5 6}, {2 2 1 5 5 5 6}, {2 2 1 5 5 6 6}, and {2 2 3 1 1 5 6}.

Input Specification:

Each input file contains one test case. For each case, the first line contains a positive integer N (≤200) which is the total number of colors involved (and hence the colors are numbered from 1 to N). Then the next line starts with a positive integer M (≤200) followed by M Eva's favorite color numbers given in her favorite order. Finally the third line starts with a positive integer L (≤10​4​​) which is the length of the given stripe, followed by L colors on the stripe. All the numbers in a line a separated by a space.

Output Specification:

For each test case, simply print in a line the maximum length of Eva's favorite stripe.

Sample Input:

6
5 2 3 1 5 6
12 2 2 4 1 5 5 6 3 1 1 5 6

Sample Output:

7

題目大意

給定喜歡的序列和待挑選的序列,在待挑選的序列中去掉不喜歡的顏色,然後找到符合喜歡的序列的順序的最長子列,不一定要包含喜歡的序列中的所有元素。

分析

使用dic儲存喜歡的序列中各個元素出現的順序,然後將給定的序列去除掉不喜歡的顏色後,轉換成該元素對應在喜歡的序列中出現的位置,使用chain陣列儲存。

遍歷chain中的每一個元素,判斷它前面的序列中是否有比它小的元素,即在喜歡的序列中出現在它前面的元素。如果沒有,則說明該元素只能作為一個子列的起始,在num字典中,以該元素為鍵值儲存,值為1.如果存在出現在它之前的元素,則取出在num字典中的最大值a,更新該元素在num字典中的值為a+1,並判斷是否大於result,如果大於則更新result。

最後輸出result即可。

python實現

def main():
    n = int(input())
    line = input().split(" ")
    like = [int(x) for x in line[1:]]
    dic = {like[x]:x for x in range(len(like))}
    line = input().split(" ")
    chain = [dic[int(x)] for x in line[1:] if int(x) in like]
    num = {x:0  for x in range(n)}
    result = 1
    for x in range(len(chain)):
        now = chain[x]
        temp = sorted([ [i, num[i]] for i in num if i <= now], key = lambda j : -j[1])
        if len(temp) == 0:
            num[now] = 1
        else:
            num[now] = temp[0][1] + 1
            if num[now] > result:
                result = num[now]
    print(result)

if __name__ == "__main__":
    main()