第一题
题意:给你一个字符串,问你它的子串中有多少个回文串,串的长度小于等于100。
题解:好像没什么可以说的,直接brute force就好了,时间复杂度
O(n3)
第二题
题意:给你一个数n代表一个n边形,再给你一个m代表你有m种颜料,现在你要给这n条边进行染色,使得任意相邻两条边的颜色都不一样,问有多少种方案,由于方案数可能很多,答案对
109+7
取模。
题解:设我们有i条边的时候,答案为
Fi
,我们考虑每加一条边之后的答案,进行分类讨论,当加入第i条边的时候,有两种情况
①新加入的边的相邻两条边的颜色互不相同,那么这时我们新加入入的这条边就有m-2种选择,然后再乘上之前的答案
Fi−1
,所以此时答案为
(m−2)×Fi−1
②新加入的边的相邻两条边的颜色相同,那么此时我们新加入的边有m-1种选择,另外在这种情况下这两条边中的一条此时对答案是没有贡献的,因为它总是跟另一条边的颜色相同,没有贡献,所以当我们还没加入这条边时,相当于只有i-2边,所以此时答案为
Fi−2×(m−1)
③综上
Fi=(m−2)×Fi−1+Fi−2×(m−1)
,但是如果直接这样算,时间复杂度是
O(n)
,原题的n小于等于
1018
然后我们用一种非常神奇的办法,求出f的特征根,套上快速幂。即可,f的特征根为
Fi=(m−1)i+(m−1)×(−1)i
。
第三题
题意:在数轴上有n个点,开始在0,每一个点都有一个权值,0这个位置没有,从点i跳到点j能够产生的价值为(j-i)乘上j的权值,最大化
从0跳到n的价值,不能往回跳。n小于等于100000。
题解:比较容易想到n方做法,100分做法不唯一,可以单调队列进行优化。
the end
由于我的水平有限,难免会有些写错的地方,希望大家批评指正,多多包容,thank you for your patience.