询问在一段区间内回文串的个数,很基础的dp问题,两个状态转移方程就可以出解,不过得把到底表示的什么状态写清楚,下标不能混了。
dp[i][j]表示从i到j区间内回文串的个数,palind[i][j]表示i-j子串是否是一个回文串,注意初始化的处理,这里WA好几次。
#include<stdio.h>
#include<string.h>
int dp[5005][5005],palind[5005][5005];
char str[5005];
int main(){
int l,r,q;
scanf("%s",&str[1]);
memset(dp,0,sizeof(dp));
memset(palind,0,sizeof(palind));
scanf("%d",&q);
for(int i=1;i<=strlen(str+1);i++){
dp[i][i]=1;//每个单独的字母都是一个回文串
palind[i][i]=1;
palind[i][i-1]=1;
}
for(int len=2;len<=strlen(str+1);len++)
for(int i=1,j=len;j<=strlen(str+1);i++,j++){
palind[i][j]=palind[i+1][j-1]&&(str[i]==str[j]);
dp[i][j]=dp[i][j-1]+dp[i+1][j]-dp[i+1][j-1]+palind[i][j];
}
for(int i=0;i<q;i++){
scanf("%d %d",&l,&r);
printf("%d\n",dp[l][r]);
}
return 0;
}