算法73-全消子序列的最大长度

题目:
在这里插入图片描述
分析:
范围上尝试模型

代码

#!/usr/bin/python
# -*- coding:utf-8 -*-
#wangzhoufeng
#最长全消子序列,如“0231”给定的字符只有四种0,1,2,3,, 0和1在一起时消除,2和三在一起时消除,先消掉23,再消除01,
def process(s,l,r):
    if l>=r:#范围为0
        return 0
    if l==r-1:#范围为2
        if (s[l]=="0" and s[r]=="1") or (s[l]=="2" and s[r]=="3"):
            return 2
        else:
            return 0
    p1=process(s,l+1,r)#可能性1  能消除的子序列,s[l]不考虑,最大是多少
    if s[l]=="1" or s[l]=="3":#l左边没字符,当l为1或者3时,只有可能性1
        return p1
    #l位置为0或者2
    #0去找1,2去找3
    find=""
    if s[l]=="0":
        find="1"
    elif s[l]=="2":
        find="3"
    # print find
    i=l+1
    p2=0
    while i <=r:
        if s[i]==find:
            #逻辑上将l到r的区间分为三部分:l+1.....i.......r
            #find找到它要找的可以消除的字符,它的左边算出一部分process(s,l+1,i-1),
            #find和它找到的字符消除,是两个长度,再加上它的右半部分process(是,i+1,r),这三个值加起来,每次算出最大值
            p2=max(p2,process(s,l+1,i-1)+2+process(s,i+1,r))
        i+=1

    return max(p1,p2)

s="02233123"
print process(s,0,len(s)-1)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值