这一周主要是在做两个事情,一个是服创项目的遗传算法的代码编写,因为使用的是一个没有很多资料的算法库,在api报错上面花费了很多时间。还有就是了解了遗传算法的一些基本概念和实现原理。
对于遗传算法的相关学习上面这两个链接都做了总结。
然后,我现在已经实现的是,适应度函数,基因生成工厂,遗传算法的引擎,相关的基本类。
蓝桥杯刷题数量30,一些重点题目的题解,在上面的总结中也有提到。
今天刷的一个比较记录的是一个这样的题目
这个题目,我一开始是使用的暴力解法,很明显运行超时了,
后面使用的思路是一个双指针的思路,通过遍历每个字符的贡献来请得到所有的贡献,简单来说就是对于每一个字符来说,它到下一个重复字符之间的子字符串中,他都相当于提供了一点贡献值。 这样的话,所有在这个字符串中包含这个字符的的子字符串都是有这个字符提供的一点贡献值。这样的字符串种类有(r - i) * (i - l)种。(r - i)这个字符前面有多少字符,(i - l)这个字符后面有多少字符。这样就可以得到答案。
代码如下
#include<bits/stdc++.h>
using namespace std;
int i, l, r, sum, len;
int main()
{
char s;
string str;
cin >> str;
len = str.length();
for(i = 0; i < len; i++)
{
s = str[i];
for(r = i+1; r < len; r++)//遍历每个字符的贡献,简单来说就是对于每一个字符来说,它到下一个重复字符之间的子字符串中,他都相当于提供了一点贡献值。
if(str[r] == s)
break;
for(l = i-1; l >= 0; l--)
if(str[l] == s)
break;
sum += (r - i) * (i - l);//对于已经求出来的子字符串进行贡献计算。在这个字符串中,要求是包含i位置字符的所有子字符串,开始位置有r - i种选择,结束位置有i - l种选择。
//排列组合后结果就是(r - i) * (i - l)
}
cout << sum << endl;
return 0;
}