题意
给n(1≤n≤52)(1≤n≤52)张牌,包含花色(s, h, d, c)和数字(2,3,4,5,6,7,8,9,T,J,Q,K,A),保证给你的牌在一副牌里面。你可以将其中的一张牌抽出,放到任意位置。要求你把牌排序,即按花色分开,每部分要么升序要么降序,问最少要操作多少次。
题解
枚举花色的排列和升降序,每种情况的操作次数为n减去最长上升子序列,所有情况的最小值就是答案。
代码
from __future__ import print_function
import itertools
def less(t, s, c1, c2):
global num
id1, id2 = t.index(c1[1]), t.index(c2[1])
n1, n2 = num[(s>>id1)&1].index(c1[0]), num[(s>>id2)&1].index(c2[0])
return id1<id2 or id1==id2 and n1<n2
def solve(t, s):
global n, card
dp = [1 for i in xrange(n)]
for i in xrange(n):
for j in xrange(i):
if less(t, s, card[j], card[i]):
dp[i] = max(dp[i], dp[j]+1)
return max(dp)
num = ['23456789TJQKA', 'AKQJT987654321']
it = itertools.permutations('shdc',4)
n = input()
card = raw_input().split()
ans = 10000
for t in it:
for s in xrange(16):
ans = min(ans, n-solve(t, s))
print(ans)