【美团杯2020】查查查乐乐
作者:互联网
1 for(int i=1;i<=n;i++) 2 { 3 if(s[i]=='x') 4 { 5 dp3=min(dp2,dp3+1); 6 dp2=min(dp1,dp2+1); 7 dp1++; 8 } 9 else 10 { 11 dp5=min(dp4,dp5+1); 12 dp4=min(dp3,dp4+1); 13 } 14 }View Code
【美团杯2020】查查查乐乐
Description
“查查查乐乐”是一段古老神秘的咒语,只有被选中的魔法师才有资格使用这一段咒语并享用它所带来的力量;而如果这段咒语出现在了不具资格的魔法师的口中,这个魔法师将会遭到咒语的反噬并付出可怕的代价。
这个学期,镁团在一家魔法早教学校做兼职,他的任务是教小学生们魔法并帮助他们准备一年一度的全国魔法奥林匹克竞赛 (NOMP)。今天,镁团在整理图书的时候,突然发现一本课外教材中包含了 t 段只由查和乐组成的咒语。让小学生们阅读这些咒语是非常危险的:他们可能会在无意识中念出“查查查乐乐”。
因此,作为一名富有责任心的儿童教师,镁团打算修改这些咒语,从而最大程度地杜绝这方面的隐患。镁团认为一段由查和乐组成的咒语是危险的当且仅当在删去咒语中的若干个字(也可以不删)后,剩下的咒语可能变成查查查乐乐。举例来说,“查查查乐乐”,“查查乐查乐乐” 就是危险的,而 “乐乐查查查”,“乐查乐乐查乐查查”就不是危险的。
对于每一段咒语,镁团都可以选择若干个位置并对这些位置进行修改:他可以把“查”变成“乐”,也可以把“乐”变成“查”。为了最大限度地保留教学效果,镁团希望使用尽可能少的修改来消除所有的危险性:对于每一段咒语,镁团都希望你帮他计算一下最少的修改次数。
Input
输入第一行是一个整数 t(1≤t≤1000),表示咒语的数量。
对于每组数据,输入包含一行一个只包含字符 x
和 l
的字符串 s(1≤|s|≤100),描述了一段咒语。其中 x
表示“查”,l
表示 “乐”。
output
对于每段咒语,输出一行一个整数表示最少的修改次数。
Examples
Input
3
xxxll
xxlxllllxl
xxxxxlllll
Output
1
1
3
正确解法:
dp问题,一个字符串里面不能出现xxxll字符。
设dp1是不存在x序列的修改次数
dp2不存在xx序列的修改次数
dp3不存在xxx序列的修改次数
dp4不存在xxxl序列的修改次数
dp5不存在xxxll序列的修改次数
if(s[i]=='x')
dp1++;//修改x本身
dp2=min(dp1,dp2+1);//修改这个x(dp2+1)或者修改上一个x dp[1][i-1]
dp3=min(dp2,dp3+1);
else
dp4=min(dp3,dp4+1);//修改这个l 或者修改上一个x dp[3][i-1]
dp5=min(dp4,dp5+1);//修改这个l 或者修改上一个l dp[4][i-1]
因为修改的都是前一个dp ,所以应该把顺序变换一下。(减少空间)
标签:乐乐,镁团,查查,修改,美团杯,咒语,2020,dp 来源: https://www.cnblogs.com/Kaike/p/12912918.html