题目描述
给定一个字符串 S(S.lenth < 5000),只包含 0 和 1 两个数字,下标从 1 开始,设第 i 位的价值为 vali,则vali的定义如下:
当 i = 1 时:val1 = 1;
当 i > 1 时:
若Si != S(i - 1):vali = 1,
若Si == S(i - 1):vali = val(i - 1) + 1;
字符串 S 的总价值等于 val1 + val2 + ... + valn(n为字符串 S 的长度)。
你可以任意删除字符串 S 中的任意字符,使得字符串 S 的总价值能够达到最大。
输入描述
输入只有一行,为字符串 S
输出描述
输出一个整数代表答案
输入示例
010101
输出示例
7
提示信息
删除一些字符后,S变为 0001 或 0111 时能够达到最大价值。
解法:
def best_value(s):
n=len(s)
count0=0
count1=0
for i in range(n):
if s[i]=='0':
count0+=1
else:
count1+=1
# 选出0和1中最多的
max_char='1'
count=count1
if count1<count0:
max_char='0'
count=count0
# 找出0或1删除后最长的,再加上剩下的
dp=[0]*n # 存储i的value
flag=0
max_now=0
for i in range(n):
if s[i]==max_char:
dp[i]=max_now+1
max_now+=1
count-=1
if count:
flag=1
else:
flag=0
else:
# 需要删除
if flag:
dp[i]=0
# 不用删除,只剩下0或1
else:
if i>0 and s[i]==s[i-1]:
dp[i]=dp[i-1]+1
else:
dp[i]=1
ans=sum(dp)
return ans
s=input()
print(best_value(s))