题意是求给一个字符串算出其中有多少个回文子串(每个回文子串必须是连续的),关于这题由于数据范围才5000,所以可以用O(N*N)的动态规划去做或者是用暴力的搜索,每次枚举回文串的对称中点复杂度不超过O(N*N),但是用dp做就很蛋疼了,因为内存限制存不了所有的状态,所以得用滚动数组去存,下面将给出几种不同实现的代码。如果暴力枚举中点方法确实很简单,但我还是建议,写一下dp,/可以锻炼一下代码能了,或者说是扩展一下思维吧 这题有成型的算法是MANACHER算法。。
***********************************************************
强烈建议看一下这题,也是回文串不过就只能dp了点击打开链接,dp的状态转移方程十分相似,但难度不一样
*************************************************************
我的动态规划代码,因为这题和我前不久做过的一题很像,所以就套用了一下思路,写了一个dp式 dp[i][j]=dp[i][j-1]+dp[i+1][j]-dp[i+1][j-1] ,另外如果从i到j的子串也是回文串则dp[i][j]+=1;dp[i][j] 表示从i到j内有多少个满足的回文子串。举例,如ch[10000]=asa则dp[0][1] 的值是2,有a和s 2个回文子串 又dp[1][1]=1,dp[1][2]=2且 ch[0]=ch[2]同时有ch[1]到ch[1]也是回文子串 所以 d[0][2]=dp[0][1]+dp[1][2]-dp[1][1]+1=4
强烈建议看一下这题,也是算回文串不过就只能dp了点击打开链接
有了这个递推式要是写记忆化搜索是很快的,于是我就有了如下代码(别急着ctrl+c 代码不会AC的)
#include <cstdio>
#include<cstring>
#in