题目:
分析:
范围上尝试模型
代码
#!/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)