最多子序列(c++求法)
TIPS:
- 蒟蒻题解,有提供详细思路,用的是递归,有点呆,仅供参考,有什么问题欢迎评论哦
题目:
-
Lambda 指挥官度过了令人难以置信的成功一周:她完成了她的 LAMBCHOP 世界末日装置的第一次试运行,她俘获了 Bunny Rebellion 的六名关键成员,并在俄罗斯方块中打破了她的个人最高分。为了庆祝,她为每个人都点了蛋糕——即使是最底层的奴才!但是奴才之间的竞争非常激烈,如果你不为每个人切出完全相同的蛋糕,你就会遇到大麻烦。 -
蛋糕是圆形的,边缘用 M&M 巧克力装饰。但是,虽然蛋糕的其余部分是统一的,但 M&Ms 却不是:有多种颜色,每个仆从必须得到完全相同的 M&Ms 序列。 Lambda 指挥官讨厌浪费,不会容忍任何剩菜剩饭,因此您还想确保您可以供应整块蛋糕。 -
为了帮助您最好地切蛋糕,您已将蛋糕上 M&Ms 的颜色序列变成了一个字符串:每个可能的字母(a 和 z 之间)对应一种独特的颜色,并且 M&Ms 的序列按顺时针方向给出(装饰在蛋糕的外边缘形成一个圆圈)。 -
编写一个名为 answer(s) 的函数,给定一个 长度小于 200 个字符 的非空字符串来描述 M&Ms 的序列,返回可以从蛋糕上切下的最大数量的相等部分,而不会留下任何剩菜。
(分割线)-----------------------------------------------(分割线)
(手动高亮) 好了,重点都给你们斜体加粗了,下面我先讲一下思路
//由于不会留下任何剩菜,所以父序列首字符一定是子序列的首个字符(只能全部平均分,或者不分)
(分割线)-----------------------------------------------(分割线)
- tips:上面的思路我有进行缩进处理,仿照代码的思路
- 下面直接上代码~
#include <bits/stdc++.h>
using namespace std;
char s[250];
int temp2;
int total=1;
bool flag;
bool flag2;
bool flag3;
void answer(int k)
{
int y=0;
flag = true;
flag2 = true;
flag3 = true;
temp2 = k;
for(int j=0;j<strlen(s)/temp2;j++)
{
for(int d=0;d<temp2;d++)
{
if(s[k++]==s[y++]&&k<strlen(s))
continue;
else
{
if(s[k-1]!=s[y-1])
{
flag = false;
break;
}
if(k>=strlen(s))
{
flag3=false;
break;
}
}
}
total+=1;
if(!flag||!flag3)
break;
}
if(!flag)
{
while(temp2<=(strlen(s)/2))
{
temp2++;
if(s[0]==s[temp2])
{
flag2 = false;
total = 1;
answer(temp2);
break;
}
}
if(flag2&&!flag)
{
total = 1;
return ;
}
}
}
int main()
{
cin>>s;
int z=0,k;
char temp = s[z++];
while(z<strlen(s))
{
if(s[z]==temp)
{
k=z;
answer(k);
break;
}
z+=1;
}
cout<<total<<endl;
return 0;
}
- 听学长说这是谷歌的面试题之一,我就说怎么网上稍微搜了几下都没找到求相同长度子序列数量最多情况的算法,反而一搜一大把最长子序列(也可能是我不知道这个算法有其他的学名…>^<)
|