NCPC 2016 C.Card Hand Sorting(GYM 101550C)题解

本文介绍了一个算法问题,涉及对一组牌进行排序,使得相同花色的牌按升序或降序排列,目标是最少的操作次数达到此状态。通过枚举不同情况下的花色排列和排序方式,使用动态规划求解最长上升子序列。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意

给n(1n52)(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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值