英雄会第一届在线编程大赛:单词博弈

        此题为前段时间猛然看到的,当时有思路并且收藏了起来,现在还没有结呢,当时看的记得没有几天了,可是今天一看,还有35天……

题目:

        甲乙两个人用一个英语单词玩游戏。两个人轮流进行,每个人每次从中删掉任意一个字母,如果剩余的字母序列是严格单调递增的(按字典序a<b<c)

        输入:一连串英文小写字母,长度不超过15,保证最开始的状态不是一个严格单增的序列。

        输出:1表示甲可以赢,0表示甲不能赢。

        例如:输入bad,则甲可以删掉b或者a,剩余的是ad或者bd,他就赢了,输出1.

        又如:输入aaa,则甲只能删掉1个a,乙删掉一个a,剩余1个a,乙获胜,输出0.

        注:甲乙都足够聪明,能赢绝不会选输的那一个。

==================================================================================

        最后那个注是我当时看题的时候有的,可是这次我再看题的时候,发现这个句话没了。

题目本质:

        什么事情都要看其本质,这个题如果有最后那个注,那么这个题其实就是一个最优解的问题,我最后将其转为:在给定了一连串非严格单增序列中,找出最长的一串严格单增序列。如果没有那个注,那么就没有了限制,这样就没有了最终目的。而这道题,也没有要求说出最后的可能结果

解题思路:

        看清了本质,那么解题思路就好说了。我为这个序列上的每个元素计算权。

        权的定义为:

                1.该元素的权为a,当且仅当该元素右边有a个比它大的元素,并且这些比它大的元素为严格单增序列。

                2.若不满足1,将a减1,直到满足1为止。

        计算每个元素的权,然后选出权最大的元素,用字符串长-权-1,就可以得出最少(因为甲乙足够聪明)去除的字符数。剩下的就是模2取余的事了。

        而计算权的时候,个人感觉应该从右往左找:

        例如:对于abdc这个来说,c、d的权都是0,对于b来说,右边有两个比它大的,所以此时权为2,但dc不是单增的,所以将权减1,此时为1,那么b的权就是1。

        对于a来说,右边有3个比它大的,但它右边最大的权为1,所以a的权只能是2。

=================================================================================

        思路就是这样一个思路,个人感觉这个是可实现的。如果有人用这个思路实现了,麻烦说下,有别的思路,也给分享下,锻炼一下逻辑能力。

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 35
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 35
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值