-
Queries for Number of Palindromes
- CodeForces - 245H
- 题意:查询操作,询问区间有多少个 回文串。
- 思路:查询次数较多,预处理后直接查询,通过区间DP来解决这个问题,大区间由小区间转移而来
- 从小区间到大区间的转移方程为:
-
dp[i][j]=dp[i+1][j]+dp[i][j-1]+is[i][j]-dp[i+1][j-1]; - 这里用到了一个判断新构成的i-j区间是否是回文串,所以也需要预处理,is[][]数组
- is[][]数组的初始化思路也是区间DP只有小区间是回文并且str[i]==str[j]时大区间才也构成回文。
-
#include<bits/stdc++.h> using namespace std; #define maxn 5555 int is[maxn][maxn]; int dp[maxn][maxn],q,l,r; char str[maxn]; int main() { scanf("%s",str); int n=strlen(str); for(int i=0; i<n; i++) dp[i][i]=is[i][i]=1; for(int len=1; len<n; len++) for(int i=0; i+len<n; i++) { int j=i+len; if(str[i]==str[j]) { if(len!=1) is[i][j]=is[i+1][j-1]; else is[i][j]=1; } else is[i][j]=0; } for(int len=1; len<n; len++) for(int i=0; i+len<n; i++) { int j=i+len; dp[i][j]=dp[i+1][j]+dp[i][j-1]+is[i][j]-dp[i+1][j-1]; } scanf("%d",&q); while(q--) { scanf("%d%d",&l,&r); printf("%d\n",dp[l-1][r-1]); } return 0; }
Queries for Number of Palindromes CodeForces - 245H -区间DP
本文介绍了一种高效的区间回文串查询算法,利用区间DP预处理技术,快速计算任意区间内的回文串数量,适用于大量查询场景。文章详细解释了预处理is[][]数组和dp[][]数组的过程,以及如何通过状态转移方程实现高效查询。

被折叠的 条评论
为什么被折叠?



