#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int inf=0x3f3f3f3f;
const int mod=1e4+7;
const int maxn=1e3+5;
int n,dp[maxn][maxn];//i至j区域内最多的不同回文串数
char a[maxn];
int main(){
int t,id=0;
cin>>t;
while(t--){
scanf("%s",a+1);
n=strlen(a+1);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++){
if(j==i) dp[i][j]=1;
//尽管字符相同但位置不同,也是不同的回文串,所以dp[i][i]为1
else dp[i][j]=0;
}
//因为存在减法,所以都要加上mod 再取mod
for(int len=2;len<=n;len++){
for(int i=1;i<=n;i++){
int j=i+len-1;
if(j>n) break;
dp[i][j]=(dp[i][j-1]+dp[i+1][j]-dp[i+1][j-1]+mod)%mod;
//重叠部分要减去
if(a[i]==a[j]) dp[i][j]=(dp[i][j]+dp[i+1][j-1]+1+mod)%mod;
//光收尾可以组成一个回文子串,收尾可与中间任何一个回文子串组成一个新的回文子串
}
}
printf("Case %d: %d\n",++id,dp[1][n]);
}
}
区间dp hdu4632回文子串
本文介绍了一种算法,用于计算给定字符串中不同回文子串的数量。通过动态规划的方法,计算从每个位置到字符串末尾能组成的最大不同回文串数目。核心代码展示了如何处理字符相同和位置不同的情况,以及如何利用递推关系求解问题。
摘要由CSDN通过智能技术生成